链接错误:libboost*.lib和boost*.lib存在歧义

11

我在我的项目中使用boost。我从这里http://boost.teeks99.com/下载了预编译的二进制文件。

链接时,我收到以下错误:

错误18:错误LNK2005:“public: void __cdecl boost :: thread :: join(void)”(? Join@thread@boost@@QEAAXXZ)已在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

如何解决链接错误?

更新我自己编译了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 *”文件,但然后我会收到以下错误:

错误15:错误LNK1104:无法打开文件'libboost_date_time-vc110-mt-1_53.lib'

我试图从文件夹中删除所有的"boost*lib"文件,但是然后我收到了这样的错误:

Error 15 error LNK1104:无法打开文件'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),在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时,编译器声称"函数已经定义"。可能我同时使用了动态链接和静态链接之类的东西?

更新2:我取消注释了#define BOOST_ALL_DYN_LINK此处建议的那样,现在代码编译了!我正在调查其他是否一切正常。然而,我不明白为什么我应该取消注释#define BOOST_ALL_DYN_LINK,所以欢迎评论。


2
你尝试链接Boost.Thread的静态和动态版本。boost_thread是dll的导入库,libboost_thread是静态库。 - Igor R.
为什么VS会链接两个库,如何解决这个问题? - Oleg Vazhnev
2
通常情况下,VS不会这样做,所以问题是你的设置出了什么问题。你是否定义了BOOST_ALL_DYN_LINK?你是静态链接还是动态链接CRT(/MT或/MD)?你是否强制链接上述某些库(链接器-->输入-->附加依赖项或# pragma comment(lib,...))? - Igor R.
4个回答

7

在进行编辑之前,其中一个被列为dll。请发布这两个的大小;如果其中一个比另一个小得多,则较大的一个可能是静态库,无需dll。如果它们更接近,则一个可能是调试版本,而另一个是发布版本。 - mah
1
@mah 请阅读有关 Boost 命名约定的内容:http://www.boost.org/doc/libs/1_53_0/more/getting_started/unix-variants.html#library-naming - Igor R.
@IgorR。那个页面似乎只是加强了我的最后一条评论,不是吗?从您提供的链接中,我认为libboost_thread-vc110-mt-1_52.lib将会更大,因为它将是普通的静态库,而boost_thread-vc110-mt-1_52.lib将是用于引入DLL的导入库。如果这是真的,我认为我的第一个评论已经足够了,不是吗? - mah
1
@mah 我的观点是,值得阅读手册,而不是试图猜测——尤其是在问题中存在真正的未知因素时(比如为什么VS尝试链接静态和导入库)。 - Igor R.

1

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

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

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


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中工作,则可以转到右键单击项目文件 > 属性 > 链接器 > 输入 > 忽略特定库并添加libboost_thread-vc110-mt-1_52.lib,然后尝试。


谢谢,我正在尝试从头开始构建Boost,可能是由于某种原因导致我的版本损坏了... - Oleg Vazhnev

0

在思考我的问题。 需要取消注释 #define BOOST_ALL_DYN_LINK(请参阅说明)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接