簡體   English   中英

如何使用CMake選擇性地鏈接靜態或動態boost庫?

[英]How can I optionally link against static or dynamic boost library using CMake?

我有一個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 ++進行編譯。 提前致謝!

要強制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 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM