CMakeLists.txtにBoostライブラリをどのように追加しますか?


123

CMakeLists.txtにBoostライブラリを追加する必要があります。それをどのように行うか、またはどのように追加しますか?


この行rosbuild_add_boost_directories()は何をしますか?
ラクシュ

公式ドキュメントはこちら
1

回答:


171

これをCMakeLists.txtファイルに入れます(必要に応じて、オプションをオフからオンに変更します)。

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)

2
など、ヘッダーのみのライブラリのコンポーネントを指定する必要がないことに注意してくださいlexical_cast。したがって、必要なのはfind_packageand include_directoriesコマンドだけです。
miguel.martin

1
そうでない場合は、あなたがに実行することがADD_DEFINITIONS(-DBOOST_ALL_NO_LIB):Windows上で、それはあなたのcmakeのファイルにこれを追加することも助けをすることができますstackoverflow.com/questions/28887680/...
ステファン・

BOOST_USE_STATIC_LIBSをONに、Boost_USE_STATIC_RUNTIMEをOFFに設定することは可能ですか?& 逆もまた同様。
イカ、

5
どういう*boost libraries here*意味ですか?
IgorGanapolsky

2
使用するFIND_PACKAGE(Boost REQUIRED COMPONENTS system)boostの正確なバージョンがわからない場合も使用できます
smac89

78

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

Boostを見つけると、find_package()呼び出しは多くの変数を満たします(FindBoost.cmakeのリファレンスを確認してください)。これらの中にはBOOST_INCLUDE_DIRS、Boost_LIBRARIESおよびBoost_XXX_LIBRARY変数があり、XXXは特定のBoostライブラリに置き換えられています。これらを使用して、include_directoriesおよびtarget_link_librariesを指定できます。

たとえば、boost :: program_optionsとboost :: regexが必要だとすると、次のようになります。

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を呼び出す前にこの変数を設定できます。
  • boostのビルドバージョンが複数ある場合(マルチスレッド、静的、共有など)、find_packageを呼び出す前に必要な構成を指定できます。に次のいくつかの変数を設定することでこれを行いますOnBoost_USE_STATIC_LIBSBoost_USE_MULTITHREADEDBoost_USE_STATIC_RUNTIME
  • WindowsでBoostを検索する場合は、自動リンクに注意してください。リファレンスの「Visual Studioユーザー向けの注意」をお読みください
    • 私のアドバイスは、自動リンクを無効にして、cmakeの依存関係処理を使用することです。 add_definitions( -DBOOST_ALL_NO_LIB )
    • 場合によっては、動的ブーストを使用することを明示的に指定する必要があります。 add_definitions( -DBOOST_ALL_DYN_LINK )

3
一般的なヒントをありがとうございます。彼らは私をたくさん助けてくれました。
タイラーロング

信じられないほど役立つ回答!2年前にこれを見つけたとしたら、多くの時間を節約できたでしょう。素晴らしい記事。
Ela782 2014年

22

インポートされたターゲットを使用した最新のCMake構文に対する@LainIwakuraの回答を適応させると、次のようになります。

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
ブーストのすべてに対してリンクしたい場合、これはどのように見えますか?つまり、すべてのライブラリーをリストしないと、ブーストが発生します。
Toby Brull 2017

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

2
@oLenインポートされたすべてのcmake Boost :: *ターゲットのリストはどこにありますか?リンク先を知るにはどうすればよいですか?
マーカス

8

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

これらの行は、プロジェクトの実行可能ファイルを作成する前に最初に書き込まれます。この段階では、boostライブラリをプロジェクトの実行可能ファイルにリンクする必要がないためです。

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()

2

答え12に同意します。ただし、各ライブラリを個別に指定することをお勧めします。これにより、大きなプロジェクトで依存関係が明確になります。ただし、(大文字と小文字が区別される)変数名を誤って入力する危険があります。その場合、直接のcmakeエラーはありませんが、後でいくつかの未定義の参照リンカーの問題が発生し、解決に時間がかかる場合があります。したがって、私は次の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)

上記の例の場合、これは次のようになります。

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

「BOOST_PROGRAM_OPTIONS_LIBRARY」と書いた場合、cmakeによってトリガーされるエラーが発生し、後でリンカーによってトリガーされることはほとんどありません。


2

Boostのドキュメントを言ってみてください:

set(Boost_USE_STATIC_LIBS        ON)  # only find static libs
set(Boost_USE_DEBUG_LIBS         OFF) # ignore debug libs and 
set(Boost_USE_RELEASE_LIBS       ON)  # only find release libs 
set(Boost_USE_MULTITHREADED      ON)
set(Boost_USE_STATIC_RUNTIME    OFF) 
find_package(Boost 1.66.0 COMPONENTS date_time filesystem system ...)
if(Boost_FOUND)   
    include_directories(${Boost_INCLUDE_DIRS})
    add_executable(foo foo.cc)   
    target_link_libraries(foo ${Boost_LIBRARIES})
endif()

fooをプロジェクト名に、コンポーネントをあなたのプロジェクト名に置き換えることを忘れないでください!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.