10

我在我的项目中使用了 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我已按照此处#define BOOST_ALL_DYN_LINK的建议取消注释,现在代码编译!我正在调查其他一切是否正常。但是我不明白为什么我应该取消评论,所以欢迎评论。#define BOOST_ALL_DYN_LINK

4

4 回答 4

7

编辑:由于对帖子的编辑改变了情况,因此删除了初始声明。

基于http://www.boost.org/doc/libs/1_53_0/more/getting_started/unix-variants.html#library-naming(由 Igor R. 提供):

libboost_thread-vc110-mt-1_52.lib 是静态库(不需要 DLL) boost_thread-vc110-mt-1_52.lib 是 DLL 的导入库

您只需要使用其中之一。

于 2013-04-17T09:37:29.370 回答
1

error LNK1104: cannot open file 'libboost_date_time-*.lib'如果您遇到错误,请尝试另一个想法/解决方案:

在我们的项目中,我们包含该boost/date_time.hpp文件。我们在项目设置中定义常量 BOOST_ALL_NO_LIB而不是 BOOST_ALL_DYN_LINK 来告诉 boost 不要自动选择要链接的库。有关此选项的更多信息,请参阅 Boost文档

因此,您可以添加BOOST_ALL_NO_LIBProject Properties -> C/C++ -> Preprocessor -> Preprocessor Definitions 并检查此链接器错误是否消失。

于 2014-11-20T15:08:51.723 回答
0

我认为首先你需要纠正你的问题。你的意思是(我猜你已经知道和之间的DLL区别LIB

  • libboost_thread-vc110-mt-1_52.lib
  • boost_thread-vc110-mt-1_52。dll

或者

  • libboost_thread-vc110-mt-1_52.lib
  • boost_thread-vc110-mt-1_52。

无论如何,问题似乎在于您正在混合使用静态(libboost_thread-vc110-mt-1_52.lib)和共享(boost_thread-vc110-mt-1_52.lib)增强库。但是如果没有工作环境和平台细节,我就无法找到一个准确的解决方案。如果你在 工作Visual Studio,那么你可以去right click on project file> properties> linker> input>ignore specific library并在libboost_thread-vc110-mt-1_52.lib那里添加并尝试。

于 2013-04-17T09:59:49.380 回答
0

我自己问我的问题。需要取消注释#define BOOST_ALL_DYN_LINK(参考描述)

于 2013-04-19T08:19:08.443 回答