2014-03-29 111 views
1

時遇到編譯在Windows 7下面的C++代碼:Windows 7的MinGW的編譯錯誤使用Boost ASIO

#include <boost/asio.hpp> 
#include <iostream> 

void handler1(const boost::system::error_code &ec) 
{ 
    std::cout << "5 s." << std::endl; 
} 

void handler2(const boost::system::error_code &ec) 
{ 
    std::cout << "10 s." << std::endl; 
} 

int main() 
{ 
    boost::asio::io_service io_service; 
    boost::asio::deadline_timer timer1(io_service, boost::posix_time::seconds(5)); 
    timer1.async_wait(handler1); 
    boost::asio::deadline_timer timer2(io_service, boost::posix_time::seconds(10)); 
    timer2.async_wait(handler2); 
    io_service.run(); 
} 

我MinGW的安裝(GCC 4.8.1)在c:\mingwPATH設置正確。我已經下載了boost並聲明瞭環境變量BOOST_ROOT是它所在的路徑。我已經通過bootstrapb2升壓程序。我現在嘗試編譯:

c:\path\to\sandbox> g++ -I%BOOST_ROOT% -o main main.cpp 

給出一堆error: '::UnregisterWaitEx' has not been declared錯誤

然後我搜索了一下,看到我可能需要鏈接boost_system。所以:

c:\path\to\sandbox> g++ -I%BOOST_ROOT% -lboost_system -o main main.cpp 

相同的錯誤。以爲我會嘗試指定庫路徑。搜索了boost_system並在%BOOST_ROOT%/stage/lib中找到了靜態庫(libboost_system-mgw48-mt-1_55.a)。所以

c:\path\to\sandbox> g++ -I%BOOST_ROOT% -L%BOOST_ROOT%/stage/lib -lboost_system-mgw48-mt-1_55 -o main main.cpp 

相同的錯誤。所以我再次搜索並看到其他人建議追加一個-D-D_WIN32_WINNT=0x0601。所以

c:\path\to\sandbox> g++ -I%BOOST_ROOT% -L%BOOST_ROOT%/stage/lib -lboost_system-mgw48-mt-1_55 -o main main.cpp -D_WIN32_WINNT=0x0601 

而不可避免的錯誤:

c:\mingw\include\mswsock.h:125:20: error: 'WSAPOLLFD' was not declared in this scope 
int WSAAPI WSAPoll(WSAPOLLFD, ULONG, INT); 
       ^
c:\mingw\include\mswsock.h:125:36: error: expected primary-expression before ',' token 
int WSAAPI WSAPoll(WSAPOLLFD, ULONG, INT); 
           ^
c:\mingw\include\mswsock.h:125:41: error: expected primary-expression before ')' token 
int WSAAPI WSAPoll(WSAPOLLFD, ULONG, INT); 
            ^
c:\mingw\include\mswsock.h:125:41: error: expression list treated as compound  expression in initializer [-fpermissive] 

我要去哪裏錯了?

+1

您需要鏈接到Winsock的窗戶,加:-lwsock32 -lws2_32刪除「不可避免的錯誤」 – kenba

+0

謝謝,但仍然得到錯誤。 'g ++ -I%BOOST_ROOT%-L%BOOST_ROOT%/ stage/lib -lboost_system -mgw48 -mt-1_55 -lwsock32 -lws2_32 -o main main.cpp -D_WIN32_WINNT = 0x0601'給出了一大堆'未定義的'boost: :system :: generic_category()''錯誤。建議鏈接器在使用'boost_system'時遇到問題,但我真的不知道是什麼。 – artvandelay

+0

哦,我應該提到我必須修補'winsock2.h'這裏指定 - http://sourceforge.net/p/mingw/bugs/1980/。否則我仍然會收到那些'UnregisterWaitEx'錯誤。 – artvandelay

回答

1

我繼續並用b2 toolset=gcc --build-type=complete再次重建Boost。同樣的事情發生。最後,在所有這一切,原來我只需要把連接在命令的末尾:

C:\path\to\sandbox> g++ -D_WIN32_WINNT=0x0601 -I%BOOST_ROOT% -L%BOOST_ROOT%\stage\lib -o boosttest boosttest.cpp -lwsock32 -lws2_32 -lboost_system-mgw48-mt-d-1_55 

C:\path\to\sandbox> boosttest.exe 
5 s. 
10 s. 

-D_WIN32_WINNT仍是必要的,並且對於任何人誰跳過了其他意見,我不得不補丁winsock.h詳細http://sourceforge.net/p/mingw/bugs/1980/。並且請記得在您的PATH中放置%BOOST_ROOT%\stage\lib,以便Windows可以在運行時找到dll。

艱苦

相關問題