如何选择使用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_DIRBoost_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 
+1

完美 - 这很好,谢谢! 后续问题:你知道为什么设置Boost_USE_STATIC_LIBS为ON/OFF需要在与find_package相同的范围内发生吗?如果我将find_package从上面的if/else/endif块中取出,则不符合Boost_USE_STATIC_LIBS标志。 – KyleL 2012-07-27 15:35:07

+0

@KdawgUD即使范围不一样,它也适用于我。无论如何,if-else语句中的大部分代码重复都可以避免(请参阅更新后的答案) – sakra 2012-07-28 14:14:42

+0

再次感谢您的帮助。当我看到我认为是范围问题时,我可能一直在处理缓存问题。我采取了你的建议,删除重复的代码。干杯! – KyleL 2012-07-29 18:58:17