链接错误:模糊的libboost * .lib vs boost * .lib

时间:2013-04-17 09:31:58

标签: c++ boost

我在项目中使用了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_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文件。它可能与静态/ dinamic链接有关,但我仍然找不到解决方案。我确信我的问题非常普遍,所以我希望有人可以建议我做什么。

我试图从文件夹中删除所有“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编译器声称“已经定义了函数”时。 Probaly以某种方式我同时使用dinamic和static链接或类似的东西?

upd2 我已根据建议here取消评论#define BOOST_ALL_DYN_LINK,现在代码已编译!我正在调查其他一切是否正常。但是我不明白为什么我要取消注释#define BOOST_ALL_DYN_LINK所以欢迎提出意见。

4 个答案:

答案 0 :(得分: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的导入库

您只需要使用其中一种。

答案 1 :(得分:0)

我认为首先你需要纠正你的问题。你的意思是(我猜你已经知道DLLLIB

之间的区别
  • 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。的 LIB

无论如何,问题似乎是混合静态(libboost_thread-vc110-mt-1_52.lib)和共享(boost_thread-vc110-mt-1_52.lib)boost库。但是,如果没有工作环境和平台细节,我无法提供精确的解决方案。如果您使用的是Visual Studio,那么您可以转到right click on project file> properties> linker> input> ignore specific library并在其中添加libboost_thread-vc110-mt-1_52.lib然后尝试。

答案 2 :(得分:0)

自己问我的问题。 需要取消注释#define BOOST_ALL_DYN_LINK(参见说明)

答案 3 :(得分:0)

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

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

因此,您可以在“项目属性”中添加BOOST_ALL_NO_LIB - > C / C ++ - >预处理器 - >预处理器定义并检查此链接器错误是否消失。