我如何使用CMake的可选针对静态或动态的Boost库链接?(How can I optionall

2019-06-26 13:54发布

我有一个CMake的项目,我有时想编译反对静态Boost库,但我想也可以很容易地只使用动态库从cmake的GUI。 在我最顶层的CMakeLists.txt我有这样的:

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 ++编译。 提前致谢!

Answer 1:

要强制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()
   message(STATUS "Linking against boost dynamic libraries")
endif()

注意参数CACHE是需要使未设置命令清除高速缓存中的变量。

还要注意的是,一旦选择变量USE_STATIC_BOOST已经被缓存,你需要明确在命令行设置变量或编辑缓存文件,使CMake的一个变化值:

cmake ../.. -DUSE_STATIC_BOOST=NO 


文章来源: How can I optionally link against static or dynamic boost library using CMake?
标签: c++ boost cmake