我有一个链接到 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)
请注意,链接器会找到该库 - 如果它没有找到它,我会得到更多未解决的外部错误。
我将问题追踪到以下内容:http:
//lists.boost.org/boost-users/2009/11/54015.php很好地描述了正在发生的事情(这两个是全局变量)。现在建议的解决方案是启用动态链接并链接到 DLL。但这不是我想做的,我想链接到静态提升库(我实际上正在尝试这样做,在 VS 的 App 属性中的 Linker->Input it lists 下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 中定义的新链接器错误。按照 panickal 的建议更改 VS Runtime 选项后,这些错误也消失了,并且可以正常工作。