【问题标题】:Compiling boost::asio example on Windows在 Windows 上编译 boost::asio 示例
【发布时间】:2017-05-09 11:48:10
【问题描述】:

我正在尝试从 Linux 切换到 Windows 环境,但发现这是一条非常艰难的道路。

这次我想测试是否可以使用 boost 库。

我在 windows 上编译 boost 时遇到问题,所以我下载了预编译版本。我解压缩了所有东西并积极测试了我可以编译仅标头库。

然后我复制了一些简单的 boost::asio 示例。我在 Eclipse 中设置了所有内容。编译很顺利,但在链接过程中,我遇到了与 'boost::system' 内部内容相关的“未定义引用”问题。

C:/Users/jacek/cpp/boost_1_62_0/boost/system/error_code.hpp:221: undefined reference to `boost::system::generic_category()'
C:/Users/jacek/cpp/boost_1_62_0/boost/system/error_code.hpp:222: undefined reference to `boost::system::generic_category()'
C:/Users/jacek/cpp/boost_1_62_0/boost/system/error_code.hpp:223: undefined reference to `boost::system::system_category()'

所以我在链接选项中添加了“-lboost_system”以及库目录的路径。但这没有帮助。

g++ "-LC:\\Users\\jacek\\cpp\\boost_1_62_0\\lib64-msvc-14.0" -o TestAsio.exe "src\\Main.o" -lboost_system 

我检查了库目录,发现有一堆文件名中包含“boost_system”。它们是:

  • libboost_system-vc140-mt-1_62.lib
  • libboost_system-vc140-mt-gd-1_62.lib
  • libboost_system-vc140-mt-s-1_62.lib
  • libboost_system-vc140-mt-sgd-1_62.lib
  • libboost_system-vc140-s-1_62.lib
  • libboost_system-vc140-sgd-1_62.lib

我不知道我应该使用哪个。我尝试将“libboost_system-vc140-mt-1_62”添加到链接选项中,我尝试了所有其他文件,我尝试将文件重命名为 linux 模式“libboost_system.a”,但没有任何效果。

g++ "-LC:\\Users\\jacek\\cpp\\boost_1_62_0\\lib64-msvc-14.0" -o TestAsio.exe "src\\Main.o" -llibboost_system-vc140-mt-1_62 -llibboost_system-vc140-mt-gd-1_62 -llibboost_system-vc140-mt-s-1_62 -llibboost_system-vc140-mt-sgd-1_62 -llibboost_system-vc140-s-1_62 -llibboost_system-vc140-sgd-1_62 

我在这里做错了什么? 请帮忙... 优凯

【问题讨论】:

  • "-LC:\\ 看起来很奇怪,-L "C:\\ ?
  • 我想我在这里找到了解决方案:boost.org/more/getting_started/windows.html
  • 关键是预编译的二进制文件是用 Visual Studio 编译的,它们与 G++ 不兼容。妈的!
  • 二进制文件也与编译它们的版本之外的任何其他版本的 Visual Studio 不兼容。这就是为什么有针对几种不同编译器的已发布二进制文件的原因。

标签: c++ windows boost


【解决方案1】:

我在这篇文章的评论的帮助下自己解决了这个问题:boost asio example compilation error

看起来 Boost 的预编译版本是用 Visual Studion 创建的,与 G++ 不兼容。如果我决定安装 MinGW,那么我不能使用预编译版本的 boost,而必须使用 g++ 自己编译。

我做到了。 现在我有了用 G++ 编译的库。

我这样指定 boost 系统库的路径: c:\Users\jacek\cpp\boost_1_62_0\libraries\boost\bin.v2\libs\system\build\gcc-mingw-6.2.0\debug\link-static\

并添加此选项: -lboost_system-mgw62-d-1_62

现在 boost::system 的问题消失了。不过又弹出了一个boost asio,幸好答案就在这里:MinGW linker error: winsock

该示例现在在我的 Windows 10 笔记本电脑上运行良好。

#include <boost/asio/io_service.hpp>
#include <boost/asio/steady_timer.hpp>
#include <chrono>
#include <iostream>

using namespace boost::asio;

int main()
{
  io_service ioservice;

  steady_timer timer{ioservice, std::chrono::seconds{3}};
  timer.async_wait([](const boost::system::error_code &ec)
    { std::cout << "3 sec\n"; });

  ioservice.run();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-20
    • 1970-01-01
    相关资源
    最近更新 更多