C++ 动态链接boost库和自动链接未正常工作?
我使用以下命令在C++ 动态链接boost库和自动链接未正常工作?,c++,boost,linker-errors,boost-thread,dynamic-linking,C++,Boost,Linker Errors,Boost Thread,Dynamic Linking,我使用以下命令在win7pro上使用vs2013-Pro(VC12.0,18.00.21005.1)构建boost-1.53.0: 在此之前,我根据以下补丁修补了我的源代码: 最后,我在$BOOST\u ROOT/stage/lib下得到了如下文件: boost_atomic-vc120-mt-1_53.dll boost_atomic-vc120-mt-1_53.lib boost_atomic-vc120-mt-gd-1_53.dll boost_atomic-vc120-mt-gd-1_5
win7pro
上使用vs2013-Pro(VC12.0,18.00.21005.1)构建boost-1.53.0
:
在此之前,我根据以下补丁修补了我的源代码:
最后,我在$BOOST\u ROOT/stage/lib
下得到了如下文件:
boost_atomic-vc120-mt-1_53.dll
boost_atomic-vc120-mt-1_53.lib
boost_atomic-vc120-mt-gd-1_53.dll
boost_atomic-vc120-mt-gd-1_53.lib
...
boost_thread-vc120-mt-1_53.dll
boost_thread-vc120-mt-1_53.lib
boost_thread-vc120-mt-gd-1_53.dll
boost_thread-vc120-mt-gd-1_53.lib
...
// only theses four files have "lib" prefix
libboost_exception-vc120-mt-1_53.lib
libboost_exception-vc120-mt-gd-1_53.lib
libboost_test_exec_monitor-vc120-mt-1_53.lib
libboost_test_exec_monitor-vc120-mt-gd-1_53.lib
我构建boost::signals
库失败。因为我不知道这是否与这个问题有关,我在这里澄清一下
根据刚才的教程,我编写了一个非常简单的演示来学习boost::thread
。但是编译器给了我一个链接错误:link:fatal error LNK1104:无法打开文件'libboost_thread-vc120-mt-gd-1_53.lib'
。我四处寻找,我有一个问题。我确信我已经将项目属性>C/C++>代码生成>运行库
设置为/MDd
。但是,当我重建项目时,为什么编译器仍然尝试链接静态库libboost\u thread-vc120-mt-gd-1\u 53.lib
?我还尝试使用我找到的一些相关解决方案,例如使用BOOST\u ALL\u DYN\u LINK
或BOOST\u DYN\u LINK
预编译指令。但它不起作用。我在auto link.hpp
中发现了这样一个片段:
//
// select linkage opt:
//
#if (defined(_DLL) || defined(_RTLDLL)) && defined(BOOST_DYN_LINK)
# define BOOST_LIB_PREFIX
#elif defined(BOOST_DYN_LINK)
# error "Mixing a dll boost library with a static runtime is a really bad idea..."
#else
# define BOOST_LIB_PREFIX "lib"
#endif
它应该可以工作,但我无法得到我想要的结果:(
顺便说一句,我应该用link=static
选项重建boost库吗
演示代码
<代码> //C++ STD库
#包括
//C++增强库
#包括
#包括
//#定义BOOST_ALL_DYN_链接
//#定义增压动力链接
void WorkerFunc()
{
boost::posix_time::秒工作时间(3);
std::cout从visual studio内部:转到项目并右键单击它以获得上下文菜单。转到属性。在属性对话框中转到:
配置属性->C/C++->预处理器->预处理器定义
尝试将BOOST\u ALL\u DYN\u链接(或BOOST\u THREAD\u USE\u DLL)放入预处理器定义列表中
然后重建您的演示。在启动演示代码很长一段时间后,我终于明白了。在包含BOOST库的标题之前,我应该先添加#define BOOST\u DYN\u LINK
。我为这样一个愚蠢的错误感到抱歉。我真的花了很多时间:(我遇到了同样的问题。但你为什么说“我尝试了BOOST\u ALL\u DYN\u LINK
或BOOST\u DYN\u LINK
预编译指令,但它不起作用“在你的问题规范中,当你说放置#define BOOST_DYN_LINK
时,你的评论中应该有工作吗?它们不是有相同的效果吗?@zhangxaochen Plz看看我的代码,你会发现宏放在包含头之后。在我的例子中,BOOST::thread
需要动态链接。宏应该放在后面。”(已定义)在包含标题之前。只有这样,标题才能知道它们要动态链接。例如#define BOOST\u ALL\u DYN\u link
#include
。
//
// select linkage opt:
//
#if (defined(_DLL) || defined(_RTLDLL)) && defined(BOOST_DYN_LINK)
# define BOOST_LIB_PREFIX
#elif defined(BOOST_DYN_LINK)
# error "Mixing a dll boost library with a static runtime is a really bad idea..."
#else
# define BOOST_LIB_PREFIX "lib"
#endif
// c++ std libraries
#include <iostream>
// c++ boost libraries
#include <boost/thread.hpp>
#include <boost/date_time.hpp>
// #define BOOST_ALL_DYN_LINK
// #define BOOST_DYN_LINK
void WorkerFunc()
{
boost::posix_time::seconds worktime(3);
std::cout << "Worker: running..." << std::endl;
// Pretend to do sth. useful...
boost::this_thread::sleep(worktime);
std::cout << "Worker: finished." << std::endl;
}
int main()
{
std::cout << "main: startup." << std::endl;
// Create a worker thread.
boost::thread worker_thread(WorkerFunc);
std::cout << "main: waiting for thread..." << std::endl;
worker_thread.join();
std::cout << "main: done." << std::endl;
return 0;
}