boost.asio 链接和库

2024-05-26

我是 boost.asio 编程的新手,并且在链接 boost 库时遇到困难。

我的问题是,当我包含 asio 标头时,如何找出应该链接到我的项目的库。

例如我用过#include <boost/date_time/posix_time/posix_time.hpp> and #include <boost/asio.hpp指令。

所以这是我编译它的命令:

g++ -I /usr/local/boost_1_55_0 ASIO.cpp -o HELLO -L /usr/local/lib/ -l boost_system

考虑我的 boost 库安装在 /usr/local/boost_1_55_0 上,二进制文件位于 /usr/local/lib 上。

我的问题实际上是我需要在 -l 之后写什么

感谢您的回答。


需要链接的库将根据所使用的 Boost.Asio 功能和其他 Boost 头文件来确定。一般来说,可以通过对未定义引用的命名空间进行一些猜测来确定要链接到哪个库,并检查 Boost 库中的符号(如果不起作用)。


在下面的所有示例中,我使用的是 gcc 4.8.1。确切的错误消息并不重要,因为编译器之间的错误消息内容应该非常相似。

采用包含 Boost.Asio 的基本程序:

#include <boost/asio.hpp>

int main() {}

编译时:


$ g++ example.cpp -isystem /usr/local/boost_1_55_0
...
example.cpp:(.text+0x31): undefined reference to
    `boost::system::generic_category()'
...
/tmp/cc9ow7fd.o: In function `boost::asio::error::get_system_category()':
    example.cpp:(.text._ZN5boost4asio5error19get_system_categoryEv[
    _ZN5boost4asio5error19get_system_categoryEv]+0x5): undefined reference
     to `boost::system::system_category()'  

请注意,未定义的引用是包含在boost::system命名空间。如果要查看已安装的 Boost 库的列表,libboost_system.so可能会被认为是一个很好的链接候选者。如果没有明显的候选者,那么可以使用类似的工具nm http://linux.die.net/man/1/nm or readelf http://linux.die.net/man/1/readelf检查候选库并寻找符号:


$ nm --defined-only --print-file-name --demangle \
> /usr/local/lib/libboost_*.so | grep boost::system::generic_category
...
/usr/local/lib/libboost_system.so:
    00000000000015c0 T boost::system::generic_category()
...  

在这种情况下,boost::system::generic_category()符号在文本部分定义libboost_system.so。因此,基本程序需要链接到boost_system:


g++ example.cpp -isystem /usr/local/boost_1_55_0 -L/usr/local/lib/ -lboost_system  

这是一个稍微复杂一点的示例。该程序异步等待由附加线程执行的协程中的单调计时器。

#include <boost/asio.hpp>
#include <boost/asio/spawn.hpp>
#include <boost/asio/steady_timer.hpp>
#include <boost/thread/thread.hpp>

boost::asio::io_service io_service;

void handler(boost::asio::yield_context yield)
{
  boost::asio::steady_timer timer(io_service);
  timer.expires_from_now(boost::chrono::seconds(3));
  timer.async_wait(yield);
}

int main()
{
  boost::asio::spawn(io_service, &handler);
  boost::thread thread(boost::bind(
      &boost::asio::io_service::run, &io_service));
  thread.join();
}

虽然可以使用与以前相同的方法,但链接器错误会导致 40 多行模板符号损坏,这可能非常令人畏惧。作为一种替代方法,可以编译该示例,但不能使用-c选项。然后,可以检查生成的目标文件中是否有未定义的符号:


$ g++ example.cpp -isystem /usr/local/boost_1_55_0 -c
$ nm --demangle --undefined example.o | grep boost
    U boost::coroutines::stack_traits::default_size()
    U boost::coroutines::stack_traits::is_unbounded()
    U boost::coroutines::stack_traits::maximum_size()
    U boost::coroutines::stack_traits::minimum_size()
    U boost::coroutines::detail::coroutine_context::jump(
        boost::coroutines::detail::coroutine_context&, long, bool)
    U boost::coroutines::detail::coroutine_context::coroutine_context(
        void (*)(long), boost::coroutines::stack_context const&)
    U boost::coroutines::detail::coroutine_context::coroutine_context()
    U boost::chrono::steady_clock::now()
    U boost::detail::thread_data_base::~thread_data_base()
    U boost::system::system_category()
    U boost::system::generic_category()
    U boost::thread::join_noexcept()
    U boost::thread::native_handle()
    U boost::thread::start_thread_noexcept()
    U boost::thread::detach()
    U typeinfo for boost::detail::thread_data_base
    U vtable for boost::detail::thread_data_base  

此输出比链接器错误更易于管理。再次,符号命名空间(boost::coroutine, boost::chrono, boost::thread, and boost::system)提供了关于哪个库可以定义该符号的良好提示。上述程序可以通过以下方式编译和链接:


g++ example.cpp -isystem /usr/local/boost_1_55_0 -L/usr/local/lib/ -lboost_coroutine -lboost_chrono -lboost_thread -lboost_system  

另外,请注意链接顺序很重要 https://stackoverflow.com/q/45135/1053968.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

boost.asio 链接和库 的相关文章

  • 通过 CMIS (dotCMIS) 连接到 SP2010:异常未经授权

    我正在使用 dotCMIS 并且想要简单连接到我的 SP2010 服务器 我尝试用 C 来做到这一点 如下所示http chemistry apache org dotnet getting started with dotcmis htm
  • WCF RIA 服务 - 加载多个实体

    我正在寻找一种模式来解决以下问题 我认为这很常见 我正在使用 WCF RIA 服务在初始加载时将多个实体返回给客户端 我希望两个实体异步加载 以免锁定 UI 并且我想利用 RIA 服务来执行此操作 我的解决方案如下 似乎有效 这种方法会遇到
  • 在哪里可以找到列出 SSE 内在函数操作的官方参考资料?

    是否有官方参考列出了 GCC 的 SSE 内部函数的操作 即 头文件中的函数 除了 Intel 的 vol 2 PDF 手册外 还有一个在线内在指南 https www intel com content www us en docs in
  • 不支持将数据直接绑定到存储查询(DbSet、DbQuery、DbSqlQuery)

    正在编码视觉工作室2012并使用实体模型作为我的数据层 但是 当页面尝试加载时 上面提到的标题 我使用 Linq 语句的下拉控件往往会引发未处理的异常 下面是我的代码 using AdventureWorksEntities dw new
  • ASP.NET MVC:这个业务逻辑应该放在哪里?

    我正在开发我的第一个真正的 MVC 应用程序 并尝试遵循一般的 OOP 最佳实践 我正在将控制器中的一些简单业务逻辑重构到我的域模型中 我最近一直在阅读一些内容 很明显我应该将逻辑放在域模型实体类中的某个位置 以避免出现 贫血域模型 反模式
  • 类模板参数推导 - clang 和 gcc 不同

    下面的代码使用 gcc 编译 但不使用 clang 编译 https godbolt org z ttqGuL template
  • HTTPWebResponse 响应字符串被截断

    应用程序正在与 REST 服务通信 Fiddler 显示作为 Apps 响应传入的完整良好 XML 响应 该应用程序位于法属波利尼西亚 在新西兰也有一个相同的副本 因此主要嫌疑人似乎在编码 但我们已经检查过 但空手而归 查看流读取器的输出字
  • OleDbDataAdapter 未填充所有行

    嘿 我正在使用 DataAdapter 读取 Excel 文件并用该数据填充数据表 这是我的查询和连接字符串 private string Query SELECT FROM Sheet1 private string ConnectStr
  • 将 VSIX 功能添加到 C# 类库

    我有一个现有的单文件生成器 位于 C 类库中 如何将 VSIX 项目级功能添加到此项目 最终目标是编译我的类库项目并获得 VSIX 我实际上是在回答我自己的问题 这与Visual Studio 2017 中的单文件生成器更改 https s
  • 使用 WebClient 时出现 System.Net.WebException:无法创建 SSL/TLS 安全通道

    当我执行以下代码时 System Net ServicePointManager ServerCertificateValidationCallback sender certificate chain errors gt return t
  • C#中如何移动PictureBox?

    我已经使用此代码来移动图片框pictureBox MouseMove event pictureBox Location new System Drawing Point e Location 但是当我尝试执行时 图片框闪烁并且无法识别确切
  • C++ OpenSSL 导出私钥

    到目前为止 我成功地使用了 SSL 但遇到了令人困惑的障碍 我生成了 RSA 密钥对 之前使用 PEM write bio RSAPrivateKey 来导出它们 然而 手册页声称该格式已经过时 实际上它看起来与通常的 PEM 格式不同 相
  • 重载<<的返回值

    include
  • 如何序列化/反序列化自定义数据集

    我有一个 winforms 应用程序 它使用强类型的自定义数据集来保存数据进行处理 它由数据库中的数据填充 我有一个用户控件 它接受任何自定义数据集并在数据网格中显示内容 这用于测试和调试 为了使控件可重用 我将自定义数据集视为普通的 Sy
  • 对现有视频添加水印

    我正在寻找一种用 C 在视频上加水印的方法 就像在上面写文字一样 图片或文字标签 我该怎么做 谢谢 您可以使用 Nreco 视频转换器 代码看起来像 NReco VideoConverter FFMpegConverter wrap new
  • 如何将带有 IP 地址的连接字符串放入 web.config 文件中?

    我们当前在 web config 文件中使用以下连接字符串 add name DBConnectionString connectionString Data Source ourServer Initial Catalog ourDB P
  • 基于 OpenCV 边缘的物体检测 C++

    我有一个应用程序 我必须检测场景中某些项目的存在 这些项目可以旋转并稍微缩放 更大或更小 我尝试过使用关键点检测器 但它们不够快且不够准确 因此 我决定首先使用 Canny 或更快的边缘检测算法 检测模板和搜索区域中的边缘 然后匹配边缘以查
  • 如何将服务器服务连接到 Dynamics Online

    我正在修改内部管理应用程序以连接到我们的在线托管 Dynamics 2016 实例 根据一些在线教程 我一直在使用OrganizationServiceProxy out of Microsoft Xrm Sdk Client来自 SDK
  • C# - OutOfMemoryException 在 JSON 文件上保存列表

    我正在尝试保存压力图的流数据 基本上我有一个压力矩阵定义为 double pressureMatrix new double e Data GetLength 0 e Data GetLength 1 基本上 我得到了其中之一pressur
  • 如何防止用户控件表单在 C# 中处理键盘输入(箭头键)

    我的用户控件包含其他可以选择的控件 我想实现使用箭头键导航子控件的方法 问题是家长控制拦截箭头键并使用它来滚动其视图什么是我想避免的事情 我想自己解决控制内容的导航问题 我如何控制由箭头键引起的标准行为 提前致谢 MTH 这通常是通过重写

随机推荐