我在我的项目中使用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
,并检查这个链接器错误是否消失。
我认为你首先需要纠正你的问题。你的意思是(我猜你已经知道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
) 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(参考描述)