【问题标题】:How can I optionally link against static or dynamic boost library using CMake?如何使用 CMake 选择性地链接静态或动态 boost 库?
【发布时间】:2012-07-25 16:21:05
【问题描述】:

我有一个 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 不会切换它。我什至试图 unset(Boost_LIBRARIES) 明确清除它。有没有办法做我想做的事?

使用 x86_64 Linux 和 g++ 编译。提前致谢!

【问题讨论】:

    标签: c++ boost cmake


    【解决方案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 参数是使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 标志。
    • @KdawgUD 即使范围不同,它也对我有用。无论如何,可以避免 if-else 语句中的大部分代码重复(请参阅更新的答案)
    • 再次感谢您的帮助。当我看到我认为是范围问题时,我可能一直在与缓存问题作斗争。我接受了您删除重复代码的建议。干杯!
    猜你喜欢
    • 2011-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多