如何选择使用CMake链接静态或动态增强库?
问题描述:
我有一个CMake项目,我有时想要针对静态boost库进行编译,但是我也想简单地使用cmake GUI中的动态库。在我最顶层的CMakeLists.txt我有这样的:如何选择使用CMake链接静态或动态增强库?
option(USE_STATIC_BOOST "Build with static BOOST libraries instead of dynamic" NO)
然后在不同的文件中,我有以下的逻辑成立:
if(USE_STATIC_BOOST)
unset(Boost_LIBRARIES)
message(WARNING "Linking against boost static libraries")
set(Boost_USE_STATIC_LIBS ON)
set(Boost_USE_MULTITHREADED ON)
find_package(Boost REQUIRED COMPONENTS thread program_options system)
else(USE_STATIC_BOOST)
unset(Boost_LIBRARIES)
message(WARNING "Linking against boost dynamic libraries")
set(Boost_USE_STATIC_LIBS OFF)
set(Boost_USE_MULTITHREADED ON)
find_package(Boost REQUIRED COMPONENTS thread program_options system)
endif(USE_STATIC_BOOST)
这似乎如果我从头开始做工精细使用方法:
cmake ../.. -DUSE_STATIC_BOOST=YES
然而,当我使用
ccmake ../..
无论我做什么,我都无法使用静态库。 CMake似乎在启动时将动态选项加载到缓存中,并且更改USE_STATIC_BOOST不会将其切换。我甚至试图解除(Boost_LIBRARIES)来明确地清除它。有没有办法做我想做的事情?
使用x86_64 Linux和g ++编译。提前致谢!
答
要强制FindBoost CMake的模块来搜索所需的库再次,你必须清除缓存变量Boost_INCLUDE_DIR
和Boost_LIBRARY_DIRS
,即:
set(Boost_USE_STATIC_LIBS ${USE_STATIC_BOOST})
set(Boost_USE_MULTITHREADED ON)
unset(Boost_INCLUDE_DIR CACHE)
unset(Boost_LIBRARY_DIRS CACHE)
find_package(Boost REQUIRED COMPONENTS thread program_options system)
if(USE_STATIC_BOOST)
message(STATUS "Linking against boost static libraries")
else(USE_STATIC_BOOST)
message(STATUS "Linking against boost dynamic libraries")
endif(USE_STATIC_BOOST)
注意参数CACHE
是必要使unset命令清除缓存中的变量。
还要注意的是,一旦选择变量USE_STATIC_BOOST
已经被缓存,你需要明确设置变量在命令行或在缓存文件中编辑值,使CMake的一个变化:
cmake ../.. -DUSE_STATIC_BOOST=NO
完美 - 这很好,谢谢! 后续问题:你知道为什么设置Boost_USE_STATIC_LIBS为ON/OFF需要在与find_package相同的范围内发生吗?如果我将find_package从上面的if/else/endif块中取出,则不符合Boost_USE_STATIC_LIBS标志。 – KyleL 2012-07-27 15:35:07
@KdawgUD即使范围不一样,它也适用于我。无论如何,if-else语句中的大部分代码重复都可以避免(请参阅更新后的答案) – sakra 2012-07-28 14:14:42
再次感谢您的帮助。当我看到我认为是范围问题时,我可能一直在处理缓存问题。我采取了你的建议,删除重复的代码。干杯! – KyleL 2012-07-29 18:58:17