BoostライブラリをCMakeLists.txtに追加する必要があります。それをどのように行うか、どのように追加しますか?
これを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)
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} )
一般的なヒント:
On
に設定します:Boost_USE_STATIC_LIBS
、Boost_USE_MULTITHREADED
、Boost_USE_STATIC_RUNTIME
add_definitions( -DBOOST_ALL_NO_LIB )
add_definitions( -DBOOST_ALL_DYN_LINK )
インポートされたターゲットを使用した最新の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
は、必要なブーストライブラリに置き換えることができます。
これが一部の人々に役立つかもしれません。いたずらなエラーが発生しました: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()
私は答えに同意します 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によってトリガーされたエラーがあり、リンカーによってトリガーされることはあまりありませんでした。
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をプロジェクト名に、コンポーネントを自分のプロジェクト名に置き換えることを忘れないでください!