我在我的项目中使用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
,所以欢迎评论。
boost_thread
是dll的导入库,libboost_thread
是静态库。 - Igor R.BOOST_ALL_DYN_LINK
?你是静态链接还是动态链接CRT(/MT或/MD)?你是否强制链接上述某些库(链接器-->输入-->附加依赖项或# pragma comment(lib,...)
)? - Igor R.