【发布时间】:2013-04-17 09:31:58
【问题描述】:
我在我的项目中使用了 boost。我已经从这里下载了预编译的二进制文件http://boost.teeks99.com/
链接时收到这样的错误:
Error 18 error LNK2005: "public: void __cdecl boost::thread::join(void)" (?join@thread@boost@@QEAAXXZ) already defined in boost_thread-vc110-mt-1_52.lib(boost_thread-vc110-mt-1_52.dll) C:\Oleg\projects\MBClient\FastNativeAdapter\libboost_thread-vc110-mt-1_52.lib(thread.obj) FastNativeAdapter
为什么boost会包含两个lib名字这么相似,它们有什么区别?
- libboost_thread-vc110-mt-1_52.lib
- boost_thread-vc110-mt-1_52.lib
如何修复链接错误?
upd 我自己编译了 boost。我已将boost_1_53_0\stage\lib 目录添加到链接器。该目录实际上包含“每个”文件的 3 个“副本”,例如:
- boost_atomic-vc110-mt-1_53.dll
- boost_atomic-vc110-mt-1_53.lib
- libboost_atomic-vc110-mt-1_53.lib
所以很清楚编译器声称的内容。不知何故,它无法理解要使用哪个版本的 lib 文件。它可能与静态/动态链接有关,但我仍然找不到解决方案。我确定我的问题很常见,所以我希望有人可以建议我该怎么做。
我尝试从文件夹中删除所有“libboost*”文件,但随后收到此类错误:
Error 15 error LNK1104: cannot open file 'libboost_date_time-vc110-mt-1_53.lib'
我尝试从文件夹中删除所有“boost*lib”文件,但随后收到此类错误:
Error 15 error LNK1104: cannot open file 'boost_thread-vc110-mt-1_53.lib'
然后我将boost_thread-vc110-mt-1_53.lib 复制回来,我收到很多这样的错误:
Error 16 error LNK2005: "public: virtual __cdecl boost::detail::thread_data_base::~thread_data_base(void)" (??1thread_data_base@detail@boost@@UEAA@XZ) already defined in boost_thread-vc110-mt-1_53.lib(boost_thread-vc110-mt-1_53.dll)
因此,当没有boost_thread-vc110-mt-1_53.lib 编译器声称它丢失时,当有boost_thread-vc110-mt-1_53.lib 编译器声称“函数已定义”时。可能不知何故我确实同时使用动态和静态链接或类似的东西?
upd2 我按照here 的建议取消了#define BOOST_ALL_DYN_LINK 的注释,现在代码可以编译了!我正在调查其他一切是否正常。但是我不明白为什么要取消注释 #define BOOST_ALL_DYN_LINK 所以欢迎 cmets。
【问题讨论】:
-
您尝试链接 Boost.Thread 的静态和动态版本。
boost_thread是dll的导入库,libboost_thread是静态库。 -
为什么VS链接两者,如何解决这个问题?
-
通常VS不会这样做,所以问题是你的设置有什么问题。你定义了
BOOST_ALL_DYN_LINK吗?您是静态链接还是动态链接 CRT(/MT 或 /MD)?您是否强制链接上述某些库(链接器-->输入-->附加依赖项或# pragma comment(lib,...))?