使用Boost源代码

时间:2016-09-29 16:08:08

标签: c++ boost linker boost-asio linker-errors

我有一个问题我无法摆脱。 我有一个小型私有项目,我想使用asio进行网络通信并增强线程。我不想在我的机器上安装boost,所以我在我的项目中集成了源代码。为此我创建了一个包含boost thread和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,缺少符号 - 而不是使用头文件? 那么我做错了什么?

赞赏每一个提示: - )

祝你好运, 丹

1 个答案:

答案 0 :(得分:1)

来自boost threading website

  

Boost.Thread取决于一些非标头库。

     

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

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