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;
}