【问题标题】:linking error: ambiguous libboost*.lib vs boost*.lib链接错误:不明确的 libboost*.lib 与 boost*.lib
【发布时间】: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,...))?

标签: c++ boost


【解决方案1】:

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

基于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 的导入库

您只需要使用其中之一。

【讨论】:

  • 在编辑之前,有一个被列为 dll。请张贴两者的尺寸;如果一个比另一个小得多,那么大的可能是一个静态库,不需要 dll。如果它们更接近,一个可能是调试版本,而另一个是发布版本。
  • @mah 请阅读有关 boost 命名约定的信息:boost.org/doc/libs/1_53_0/more/getting_started/…
  • @IgorR。该页面似乎只是巩固了我的最后评论,不是吗?从您提供的链接来看,在我看来 libboost_thread-vc110-mt-1_52.lib 会更大,因为它将是普通的静态库,而 boost_thread-vc110-mt-1_52.lib 将是用于拉取的导入库在 DLL 中。如果这是真的,我认为我的第一条评论就足够了,不是吗?
  • @mah 我的观点是值得阅读手册,而不是试图猜测——尤其是当问题中存在真正的未知数时(比如为什么 VS 尝试链接静态库和导入库) .
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    我认为首先你需要纠正你的问题。你的意思是(我猜你已经知道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) 增强库。但是如果没有工作环境和平台细节,我就无法制定一个准确的解决方案。如果你在Visual Studio工作,那么你可以去right click on project file>properties>linker>input>ignore specific librarylibboost_thread-vc110-mt-1_52.lib那里试试。

    【讨论】:

    • 感谢我正在尝试从头开始构建提升,可能我的版本由于某种原因被破坏了......
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-28
      • 1970-01-01
      • 2014-01-15
      • 1970-01-01
      相关资源
      最近更新 更多