【问题标题】:Windows 7 MinGW compilation error using Boost ASIO使用 Boost ASIO 的 Windows 7 MinGW 编译错误
【发布时间】:2014-03-29 10:26:54
【问题描述】:

在 Windows 7 上编译以下 C++ 代码时遇到问题:

#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();
}

我在 c:\mingw 中安装了 MinGW (gcc 4.8.1),并且我的 PATH 设置正确。我已经下载了 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]

我哪里错了?

【问题讨论】:

  • 需要链接winsock for windows,添加:-lwsock32 -lws2_32 去掉“不可避免的错误”
  • 谢谢,但仍然出现错误。 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 给出了一堆 undefined reference to boost::system::generic_category()'` 错误。建议链接器在使用 boost_system 时遇到问题,但我真的不知道是什么。
  • 哦,我应该提到我必须按照此处指定的方式修补 winsock2.h - sourceforge.net/p/mingw/bugs/1980。否则我仍然会收到那些UnregisterWaitEx 错误。
  • 仅供参考,我刚刚在我的系统上构建并运行了您的代码;它工作正常。但是,我的链接顺序是:-L%BOOST_ROOT%/stage/lib -lwsock32 -lws2_32 -lboost_system-mgw48-mt-d...
  • 谢谢,但还是不开心。我使用图形工具重新安装了mingw,而不是手动解压缩包,我已经重建了boost 1.55,然后bootstrap.bat mingw 然后b2 toolset=gcc。然后我又试了一次:g++ -I%BOOST_ROOT% -L%BOOST_ROOT%\stage\lib -lwsock32 -lws2_32 -lboost_system-mgw48-mt-1_55 -o boosttest boosttest.cpp -D_WIN32_WINNT=0x0601 按照你建议的顺序。仍然看到undefined reference to boost::system::generic_category() 错误。嗯我不知道,我会再搜索一下,看看是否有其他人有类似的问题。

标签: compilation mingw boost-asio


【解决方案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 仍然是必需的,对于跳过其他 cmets 的任何人,我必须修补 winsock.h,详细说明 http://sourceforge.net/p/mingw/bugs/1980/。请记住将%BOOST_ROOT%\stage\lib 放入您的PATH,以便Windows 可以在运行时找到该dll。

辛苦

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多