[英]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_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()
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.