链接错误:ambiguous libboost*.Lib vs boost*. Lib

linking error: ambiguous libboost*.lib vs boost*.lib

本文关键字:Lib boost vs libboost 错误 ambiguous 链接      更新时间:2023-10-16

我在我的项目中使用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:OlegprojectsMBClientFastNativeAdapterlibboost_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_0stagelib目录链接器。该目录实际上包含"每个"文件的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的注释,所以欢迎评论

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

基于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

的导入库。

你只需要使用其中一个

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

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

所以你可以在项目属性-> C/c++ ->预处理器->预处理器定义中添加BOOST_ALL_NO_LIB,并检查这个链接器错误是否消失。

我认为你首先需要纠正你的问题。你的意思是(我猜你已经知道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。自由

无论如何,问题似乎是你混合静态(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并尝试。

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