使用 Boost 源代码的链接器错误 [关闭]

Posted

技术标签:

【中文标题】使用 Boost 源代码的链接器错误 [关闭]【英文标题】:Linker Errors using Boost Sourcecode [closed] 【发布时间】:2016-09-29 16:08:07 【问题描述】:

我有一个无法解决的问题。 我有一个小型私人项目,我想在其中使用 asio 进行网络通信和提升线程。我不想在我的机器上安装 boost,所以我将源代码集成到我的项目中。为此,我创建了一个包含 boost 线程和 asio 的全局标头,如下所示:

#include "boost/asio.hpp"
#include "boost/thread.hpp"

这样我可以毫无问题地构建静态库,但共享库或可执行文件会导致链接器错误:

error LNK2019: unresolved external symbol "private: bool __cdecl boost::thread::join_noexcept(void)" (?join_noexcept@thread@boost@@AEAA_NXZ) referenced in function "public: void __cdecl boost::thread::join(void)" (?join@thread@boost@@QEAAXXZ)
error LNK2019: unresolved external symbol "class boost::thread::id __cdecl boost::this_thread::get_id(void)" (?get_id@this_thread@boost@@YA?AVid@thread@2@XZ) referenced in function "public: void __cdecl boost::thread::join(void)" (?join@thread@boost@@QEAAXXZ)
error LNK2019: unresolved external symbol "public: class boost::thread::id __cdecl boost::thread::get_id(void)const " (?get_id@thread@boost@@QEBA?AVid@12@XZ) referenced in function "public: void __cdecl boost::thread::join(void)" (?join@thread@boost@@QEAAXXZ)
error LNK2019: unresolved external symbol "private: bool __cdecl boost::thread::do_try_join_until_noexcept(unsigned __int64,bool &)" (?do_try_join_until_noexcept@thread@boost@@AEAA_N_KAEA_N@Z) referenced in function "private: bool __cdecl boost::thread::do_try_join_until(unsigned __int64)" (?do_try_join_until@thread@boost@@AEAA_N_K@Z)
error LNK2019: unresolved external symbol "public: void __cdecl boost::thread::interrupt(void)" (?interrupt@thread@boost@@QEAAXXZ) referenced in function "public: __cdecl NetworkAdapter::~NetworkAdapter(void)" (??1NetworkAdapter@@QEAA@XZ)
error LNK2019: unresolved external symbol "public: bool __cdecl boost::thread::joinable(void)const " (?joinable@thread@boost@@QEBA_NXZ) referenced in function "public: __cdecl NetworkAdapter::~NetworkAdapter(void)" (??1NetworkAdapter@@QEAA@XZ)

目前在项目中使用 boost 作为源的配置是:

#define BOOST_SYSTEM_SOURCE
#define BOOST_DATE_TIME_NO_LIB
#define BOOST_REGEX_NO_LIB
#define BOOST_THREAD_DYN_LINK
#define BOOST_THREAD_DYN_DLL
#define BOOST_THREAD_BUILD_DLL
#define BOOST_CHRONO_HEADER_ONLY
#define BOOST_DATE_TIME_NO_LIB

如果没有这个配置,链接器会要求线程、计时等的 *.lib 文件。 根据boost主页Thread和Asio是HeaderOnly,那么为什么链接器要寻找lib,缺少符号-而不是使用标头? 那么我做错了什么?

欣赏每一个提示:-)

最好的问候, 丹

【问题讨论】:

你的链接器命令行是什么? 你在哪里找到了 boost thread 是一个仅头文件库的声明? ***.com/a/2174542/2101267 同样,boost asio 只是头文件,但在某些情况下取决于某些不是的库:boost.org/doc/libs/1_51_0/doc/html/boost_asio/… 我在这里找到了 boost.org/doc/libs/1_60_0/more/getting_started/… - 第 3 点 我投票决定将此问题作为题外话结束,因为它是由完全未能阅读文档引起的。 【参考方案1】:

来自boost threading website

Boost.Thread 依赖于一些非标头库。

Boost.System:此依赖项是强制性的,您需要链接 与图书馆。 Boost.Chrono:这个依赖是可选的(见下文 如何配置),如果你需要链接库 使用一些与时间相关的接口。 Boost.DateTime:这个 依赖是强制性的,但即使 Boost.DateTime 是非 仅标头库 Boost.Thread 仅使用仅标头部分, 所以原则上你不需要链接图书馆。

所以你错了 - 它不仅仅是标题。

【讨论】:

以上是关于使用 Boost 源代码的链接器错误 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

简单线程程序的链接器错误(来自 boost_chrono 的符号丢失)

将 boost 与自己的标头和源代码链接

Thrift C++ 链接器错误(Boost 智能指针)

来自boost / serialization / vector #include的链接器错误

链接器错误:未定义的引用

使用cl 19增强正则表达式链接器错误