2012-07-27 12 views
6

私はときどき静的なブーストライブラリとコンパイルしたいCMakeプロジェクトを持っていますが、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 ++を使用してコンパイルする。前もって感謝します!

答えて

11

再び希望ライブラリを検索するFindBoost CMakeのモジュールを強制するには、キャッシュ変数Boost_INCLUDE_DIRBoost_LIBRARY_DIRS、すなわちをクリアする必要があります。引数CACHEunsetコマンドを作ることが必要であることを

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) 

注意キャッシュ内の変数をクリアします。

はまたUSE_STATIC_BOOST変数オプションは、キャッシュされた後、あなたが明示的にコマンドラインから変数を設定するか、CMakeの変更を気付かせるためにキャッシュファイル内の値を編集する必要があることに注意してください。

cmake ../.. -DUSE_STATIC_BOOST=NO 
+1

パーフェクト - 感謝しました! 質問に続きます:なぜBoost_USE_STATIC_LIBSをON/OFFに設定するのがfind_packageと同じスコープで行われる必要があるのでしょうか?上記のif/else/endifブロックからfind_packageを取得した場合、Boost_USE_STATIC_LIBSフラグは無視されます。 – KyleL

+0

@KdawgUDスコープが同じでなくても、私のために働きます。とにかく、if-elseステートメントのコードの重複の大半は避けることができます(更新された回答を参照) – sakra

+0

もう一度お手伝いをしてください。私はスコープの問題だと思っていたときにキャッシュ問題と戦っていたかもしれません。重複したコードを削除するようあなたの提案をしました。乾杯! – KyleL