2011-07-11 12 views

答えて

124

set(Boost_USE_STATIC_LIBS OFF) 
set(Boost_USE_MULTITHREADED ON) 
set(Boost_USE_STATIC_RUNTIME OFF) 
find_package(Boost 1.45.0 COMPONENTS *boost libraries here*) 

if(Boost_FOUND) 
    include_directories(${Boost_INCLUDE_DIRS}) 
    add_executable(progname file1.cxx file2.cxx) 
    target_link_libraries(progname ${Boost_LIBRARIES}) 
endif() 

は明らかに私は*boost libraries here*を置く場所あなたがしたいライブラリを配置する必要があります。あなたが書きたいfilesystemregexライブラリを使用している場合たとえば、:

find_package(Boost 1.45.0 COMPONENTS filesystem regex) 
+1

'lexical_cast'のように、ヘッダのみのライブラリにコンポーネントを指定する必要はありません。したがって、 'find_package'と' include_directories'コマンドだけが必要です。 –

+1

Windowsでは、これをcmakeファイルに追加することもできます:ADD_DEFINITIONS(-DBOOST_ALL_NO_LIB)そうでなければ、http://stackoverflow.com/questions/28887680/linking-boost-library-with-boost-use-静的なlib-off-on-windows –

+0

は、BOOST_USE_STATIC_LIBSをONに設定し、Boost_USE_STATIC_RUNTIMEをOFFに設定できますか? & 逆もまた同様。 – squid

68

使用可能なブーストライブラリを検索するfind_packageを使用することができます。ブーストの検索をFindBoost.cmakeに延期します。これは、デフォルトでCMakeと共にインストールされます。

ブーストを見つけると、find_package()コールは多くの変数を埋め込んでいます(FindBoost.cmakeのリファレンスを参照)。その中には、BOOST_INCLUDE_DIRS、Boost_LIBRARIESおよびBoost_XXX_LIBRARYの変数があり、XXXは特定のBoostライブラリに置き換えられています。これらを使用してinclude_directoriestarget_link_librariesを指定することができます。

例えば

は、あなたがブースト:: program_optionsを必要と押し上げるだろうと仮定::正規表現は、あなたのようなものだろう:

find_package(Boost REQUIRED COMPONENTS program_options regex) 
include_directories(${Boost_INCLUDE_DIRS}) 
add_executable(run main.cpp) # Example application based on main.cpp 

# Alternatively you could use ${Boost_LIBRARIES} here. 
target_link_libraries(run ${Boost_PROGRAM_OPTIONS_LIBRARY} ${Boost_REGEX_LIBRARY}) 

いくつかの一般的なヒント:

  • を検索、FindBoostをチェック環境変数$ ENV {BOOST_ROOT}です。この変数は、必要に応じてfind_packageを呼び出す前に設定できます。
  • 複数のビルドバージョンのブースト(マルチスレッド、スタティック、共有など)がある場合は、find_packageを呼び出す前に、希望する構成を指定できます。これを行うには、次の変数のいくつかをOnに設定します。Boost_USE_STATIC_LIBS,Boost_USE_MULTITHREADEDBoost_USE_STATIC_RUNTIME
  • Windowsでのブーストを検索する場合は、自動リンクに注意してください。 referenceの「Visual Studioユーザー向けのメモ」をお読みください。
    • 私のアドバイスは、自動リンクを無効にしてcmakeの依存関係の取り扱いを使用することです:add_definitions(-DBOOST_ALL_NO_LIB)
    • いくつかのケースでは、あなたが明示的にダイナミックなブーストを使用することを指定する必要があります。add_definitions(-DBOOST_ALL_DYN_LINK)
+3

一般的なヒントありがとうございます。彼らは私をたくさん助けました。 –

+0

信じられないほど役に立つ答え!私はこれを2年前に見つけたので、私に多くの時間を救ったでしょうか?素晴らしい覚書。 – Ela782

2

私は答え12に同意します。しかし、私は別々に各ライブラリを指定することを好む。これにより、大規模なプロジェクトでは熟練度がより明確になります。 しかし、(大文字小文字を区別する)変数名を誤って入力する危険性があります。 この場合、直接的なcmakeエラーはありませんが、未定義の参照リンカーの問題が後で発生するため、解決に時間がかかることがあります。私は書かれていた場合は、「BOOST_PROGRAM_OPTIONS_LIBRARY」cmakeのではなくトリガー誤りがあっただろう

VerifyVarDefined(Boost_PROGRAM_OPTIONS_LIBRARY Boost_REGEX_LIBRARY) 
target_link_libraries(run ${Boost_PROGRAM_OPTIONS_LIBRARY} ${Boost_REGEX_LIBRARY}) 

:そこで私は、次のcmakeの機能を使用しますように、上記例えば

function(VerifyVarDefined) 
    foreach(lib ${ARGV}) 
    if(DEFINED ${lib}) 
    else(DEFINED ${lib}) 
     message(SEND_ERROR "Variable ${lib} is not defined") 
    endif(DEFINED ${lib}) 
    endforeach() 
endfunction(VerifyVarDefined) 

を、これが見えます後でリンカによってトリガされます。インポートされたターゲットを備えたモダンなCMakeの構文についてLainIwakuraの答え@適応

5

、これは次のようになります。それはすでにを通じての世話をしているので、手動で含めるディレクトリを指定するにはもう必要がないこと

set(Boost_USE_STATIC_LIBS OFF) 
set(Boost_USE_MULTITHREADED ON) 
set(Boost_USE_STATIC_RUNTIME OFF) 
find_package(Boost 1.45.0 COMPONENTS filesystem regex) 

if(Boost_FOUND) 
    add_executable(progname file1.cxx file2.cxx) 
    target_link_libraries(progname Boost::filesystem Boost::regex) 
endif() 

注意インポートされたターゲットBoost::filesystemおよびBoost::regex
regexおよびfilesystemは、必要なブーストライブラリで置き換えることができます。

+1

ブーストのすべてに対してリンクすると言うとしたらどうなるでしょうか?私は、そこにあるすべての図書館をリストアップせずにいることを意味します。 –

+1

ブーストのヘッダーのみの部分を使用する場合は、 'Boost :: boost'で十分です。すべてのコンパイルされたブーストライブラリは明示的に指定する必要があります。 – oLen

0

これは一部の人に役立つ可能性があります。エラーの追加のシンボル:「_ZN5boost6system15system_categoryEv」 //usr/lib/x86_64-linux-gnu/libboost_system.so.1.58.0シンボルに 未定義の参照:いくつかを ありました DSOは、コマンドラインから欠落している私はいたずらなエラーが発生しましたcmakeList.txtの問題と私は明らかに "システム"と "ファイルシステム"ライブラリを含めるために行方不明だった。そこで、私はCMakeLists.txtにこれらの行を書きました。

これらの行は、プロジェクトの実行可能ファイルを作成する前に最初に書き込まれます。この段階では、ブーストライブラリをプロジェクトの実行可能ファイルにリンクする必要はありません。

set(Boost_USE_STATIC_LIBS OFF) 
set(Boost_USE_MULTITHREADED ON) 
set(Boost_USE_STATIC_RUNTIME OFF) 
set(Boost_NO_SYSTEM_PATHS TRUE) 

if (Boost_NO_SYSTEM_PATHS) 
    set(BOOST_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/../../3p/boost") 
    set(BOOST_INCLUDE_DIRS "${BOOST_ROOT}/include") 
    set(BOOST_LIBRARY_DIRS "${BOOST_ROOT}/lib") 
endif (Boost_NO_SYSTEM_PATHS) 


find_package(Boost COMPONENTS regex date_time system filesystem thread graph program_options) 

find_package(Boost REQUIRED regex date_time system filesystem thread graph program_options) 
find_package(Boost COMPONENTS program_options REQUIRED) 

ファイルの最後に、私はプロジェクトの実行可能ファイルとして "KeyPointEvaluation"を考慮してこれらの行を書きました。

if(Boost_FOUND) 
    include_directories(${BOOST_INCLUDE_DIRS}) 
    link_directories(${Boost_LIBRARY_DIRS}) 
    add_definitions(${Boost_DEFINITIONS}) 

    include_directories(${Boost_INCLUDE_DIRS}) 
    target_link_libraries(KeyPointEvaluation ${Boost_LIBRARIES}) 
    target_link_libraries(KeyPointEvaluation ${Boost_PROGRAM_OPTIONS_LIBRARY} ${Boost_FILESYSTEM_LIBRARY} ${Boost_REGEX_LIBRARY} ${Boost_SYSTEM_LIBRARY}) 
endif() 
関連する問題