使用 cmake 和 vs2010 链接到静态提升库,而无需自动链接
Link to static boost lib with cmake and vs2010 without automatic linking
我有一个链接到boost_program_options的应用程序,它的CMakeLists.txt看起来像
FIND_PACKAGE(Boost COMPONENTS program_options REQUIRED)
INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS})
TARGET_LINK_LIBRARIES( ${SUBPROJECT_NAME} ${Boost_LIBRARIES} )
在包含 <boost/program_options.hpp>
以禁用 vs2010 中 boost 的自动链接之前,我在代码中使用了#define BOOST_ALL_NO_LIB
,因为我想通过 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 中的应用程序属性中,在 Linker->Input 下,它列出了D:boostboost_1_47libboost_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)
到我的CMakeList.txt但它不会改变任何东西。
有什么想法可以解决这个问题吗?
更新:当链接到 boost_program_options-vc100-mt-sgd-1_47.lib 时,我收到一大堆关于 CRT 符号已经在 boost-lib 中定义的新链接器错误。按照 panickal 的建议更改 VS 运行时选项后,这些错误也消失了,它正在工作。
您必须链接到静态库。尝试链接到boost_program_options-vc100-mt-sgd-1_47.lib
而不是boost_program_options-vc100-mt-gd-1_47.lib
。
s
指示库的静态版本。您可以查看提升库命名,了解有关命名约定的更多详细信息。
更新:若要修复多定义链接器错误,请将 Configuration Properties / C/C++ / Code Generation / Runtime Library
中的 Visual Studio 运行时库选项从 Multi-threaded Debug DLL (/MDd)
更改为 Multi-threaded Debug (/MTd)
。
- CMake-按正确顺序将项目与C运行时对象文件链接
- 无法链接 CMake 中的本地库
- 将--whole archive链接器选项与CMake和具有其他库依赖项的库一起使用
- Cmake 链接问题:未定义对 Button::mousePressEvent(QGraphicsSceneMouseE
- 在 CMake 中为每个目标设置编译器/链接器标志
- 链接 cmake 时出现未定义的引用错误
- 如何将GTest与CMake一起使用?遵循谷歌指南时的链接问题
- 将 SDL2 与 CMake 链接起来
- CMake 库链接使用两个不同的编译器版本
- CMake 无法链接外部库
- CMake - 更改共享库链接选项
- CMake 3.5 中的链接器标志位置
- 对 CMake 中'cudaRegisterLinkedBinary'链接错误的未定义引用?
- 如何避免在 cmake 中自动链接 Qt5 库?
- 将源中的 GLEW 与 cmake 静态链接
- CMake 错误:链接器命令失败,退出代码为 1 和 cpp.o 文件
- 找不到 CMake 链接的库
- Opencv 链接 CMAKE 不起作用 Ubuntu 16.04 Docker
- 如何在没有外部脚本的情况下链接CMake和SQLite
- 链接CMake的Openscenegraph库