web-dev-qa-db-ja.com

CMakeLists.txtにBoostライブラリを追加するにはどうすればよいですか?

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

108
laksh

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

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*を置く場所に置く必要があります。たとえば、filesystemおよびregexライブラリを使用している場合、次のように記述します。

find_package(Boost 1.45.0 COMPONENTS filesystem regex)
157
LainIwakura

find_package を使用して、利用可能なブーストライブラリを検索できます。 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を呼び出す前に必要な構成を指定できます。これを行うには、次の変数のいくつかをOnに設定します:Boost_USE_STATIC_LIBSBoost_USE_MULTITHREADEDBoost_USE_STATIC_RUNTIME
  • WindowsでBoostを検索するときは、自動リンクに注意してください。 参照 。の「Visual Studioユーザー向けの注意」を読んでください。
    • 私のアドバイスは、自動リンクを無効にし、cmakeの依存関係処理を使用することです:add_definitions( -DBOOST_ALL_NO_LIB )
    • 場合によっては、動的Boostを使用することを明示的に指定する必要があります。add_definitions( -DBOOST_ALL_DYN_LINK )
73
André

インポートされたターゲットを使用した最新の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は、必要なブーストライブラリに置き換えることができます。

20
oLen

これが一部の人々に役立つかもしれません。いたずらなエラーが発生しました:ndefined reference to symbol '_ZN5boost6system15system_categoryEv' //usr/lib/x86_64-linux-gnu/libboost_system.so.1.58.0:error added symbols:DSO missing from command line There 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()
6
Spandan

私は答えに同意します 1 および 2 。ただし、各ライブラリを個別に指定することを好みます。これにより、大きなプロジェクトで依存関係が明確になります。ただし、(大文字と小文字を区別する)変数名の入力ミスの危険性があります。その場合、直接的な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
MarkusParker

Boost documentation :と言ってみてください

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をプロジェクト名に、コンポーネントを自分のプロジェクト名に置き換えることを忘れないでください!

1
Nikolay Pakudin