动态链接boost库和自动链接不能正常工作

Dynamic linking boost libraries and the auto-link not working properly?

本文关键字:链接 常工作 工作 boost 动态 不能      更新时间:2023-10-16

我使用以下命令在Win7 ProVS 2013 Pro (VC12.0, 18.00.21005.1)上构建boost-1.53.0:

b2 stage toolset=msvc link=shared runtime-link=shared threading=multi --without-graph --without-graph_parallel --without-mpi --without-wave --without-python

在此之前,我修补了我的源代码,按照这个补丁:#8750 for_vs2013.patch.

最后我得到了$BOOST_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: cannot open file 'libboost_thread-vc120-mt-gd-1_53.lib'。我找了一下,有个问题。我确定我已经将Project Properties > C/C++ > Code Generation > Runtime Library设置为/MDd了。但是为什么编译器仍然试图链接静态库libboost_thread-vc120-mt-gd-1_53.lib当我重建项目?我也尝试使用一些相对的解决方案,我发现,如使用BOOST_ALL_DYN_LINKBOOST_DYN_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 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;
}

从visual studio内部:转到您的项目并右键单击它以获得上下文菜单。转到属性。在属性对话框中进入:

配置属性->C/c++ ->预处理器->预处理器定义

尝试将BOOST_ALL_DYN_LINK(或BOOST_THREAD_USE_DLL)放在预处理器定义列表中。