c++ - 使用cmake和vs2010链接到静态boost lib而不自动链接

标签 c++ visual-studio-2010 boost cmake

我有一个链接到 boost_program_options 的应用程序,其 CMakeLists.txt 看起来像

FIND_PACKAGE(Boost COMPONENTS program_options REQUIRED)
INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS})
TARGET_LINK_LIBRARIES( ${SUBPROJECT_NAME} ${Boost_LIBRARIES} )

我使用 #define BOOST_ALL_NO_LIB在我的代码中包括 <boost/program_options.hpp>在vs2010中禁用boost的自动链接,因为我想通过cmake指定它以使其与linux兼容。

在 Linux 中,这段代码编译得很好(使用 cmake、make 和 gcc)。 但是在带有 VS2010 的 Windows 中,我得到了一个

2>App.obj : error LNK2001: unresolved external symbol "public: static unsigned int const boost::program_options::options_description::m_default_line_length" (?m_default_line_length@options_description@program_options@boost@@2IB)
2>App.obj : error LNK2001: unresolved external symbol "class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > boost::program_options::arg" (?arg@program_options@boost@@3V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@A)

请注意,链接器会找到该库 - 如果它没有找到它,我会收到更多 Unresolved external 错误。

我将问题归结为以下几点: http://lists.boost.org/boost-users/2009/11/54015.php这很好地描述了正在发生的事情(这两个是全局变量)。现在建议的解决方案是启用动态链接并链接到 DLL。但这不是我想做的,我想链接到静态 boost 库(我实际上正在尝试做,在链接器下的 VS 的应用程序属性中->输入它列出了 D:\boost\boost_1_47\lib\boost_program_options-vc100-mt-gd-1_47.lib

我也试过添加

set(Boost_USE_STATIC_LIBS        ON)
set(Boost_USE_MULTITHREADED      ON)
set(Boost_USE_STATIC_RUNTIME    OFF)

到我的 CMakeLists.txt 但它没有改变任何东西。

有什么办法解决这个问题吗?

更新: 当与 boost_program_options-vc100-mt-sgd-1_47.lib 链接时,我收到一大堆关于 CRT 符号已在 boost-lib 中定义的新链接器错误。 按照 panikal 的建议更改 VS 运行时选项后,这些错误也消失了并且可以正常工作。

最佳答案

您必须链接到静态库。尝试链接到 boost_program_options-vc100-mt-sgd-1_47.lib 而不是 boost_program_options-vc100-mt-gd-1_47.lib

s 表示库的静态版本。你可以查看 Boost Library Naming有关命名约定的更多详细信息。

更新: 要修复多重定义链接器错误,请将 Configuration Properties/C/C++/Code Generation/Runtime Library 中的 Visual Studio Runtime Library 选项从 Multi-threaded Debug DLL (/MDd) 更改为code> 到 多线程调试 (/MTd)

关于c++ - 使用cmake和vs2010链接到静态boost lib而不自动链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11235927/

相关文章:

c++ - 为什么删除后对象指针还能被操作?

visual-studio-2010 - 为什么在VS2010中开发时dll引用消失了?

c++ - Qt编译报错unicode/uloc.h

visual-studio-2010 - 在 Visual Studio 2010 Ultimate 中创建编码 UI 测试时出错

compiler-construction - 在哪里可以获得学习EBNF的 Material ?

c++ - 如果 basic_waitable_timer 在仍有异步操作等待时被破坏怎么办?

c++ - 使用自制的 `std::priority_queue` 初始化 `std::Compare` 时避免使用模板?

C++通过引用传递动态分配的二维数组

c++ - 无法使用 64 位 gcc 在 32 位中构建 boost 库

c++ - shared_ptr<int> 到数组的元素 (shared_ptr<int[]>)