CmakeがBoostを見つけられない


87

CMakeを使用してプロジェクトを構成しようとしていますが、指定されたフォルダーにあるにもかかわらず、Boostライブラリが見つかりません。私が指定されているBoost_INCLUDE_DIRBoost_LIBRARYDIRBOOST_ROOT、私はまだcmakeのは、ブーストを見つけることができないというエラーを取得します。そのようなエラーの理由は何でしょうか?


Boostの一部のバージョンはフラグBoost_INCLUDE_DIRを使用し、他のバージョンはフラグを使用しますBoost_INCLUDEDIRアンダースコアなし)。あなたは読むことによってあなたのケースのために右のいずれかをチェックすることができるFindBoost.cmakeの下で、ファイルをpath-to-cmake/Modules/FindBoost.cmake
marcelosalloum

find_package(Boost CONFIG)
参考までに

回答:


105

あなたはそれを正しい方法でやっていると確信していますか?アイデアは、そのcmakeのセットでBOOST_INCLUDE_DIRBOOST_LIBRARYDIRかつBOOST_ROOT自動的に。でこのようなことをしてくださいCMakeLists.txt

FIND_PACKAGE(Boost)
IF (Boost_FOUND)
    INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIR})
    ADD_DEFINITIONS( "-DHAS_BOOST" )
ENDIF()

ブーストがデフォルトの場所にインストールされておらず、したがってCMakeで見つからない場合は、次のようにブーストを探す場所をCMakeに指示できます。

SET(CMAKE_INCLUDE_PATH ${CMAKE_INCLUDE_PATH} "C:/win32libs/boost")
SET(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} "C:/win32libs/boost/lib")

もちろん、これらの2行はinの前にある必要FIND_PACKAGE(Boost)がありCMakeLists.txtます。


36
そうではあり${Boost_INCLUDE_DIR}ません${BOOST_INCLUDE_DIR}、ケースは重要です。
Ihor Kaharlichenko 2011年

3
たぶんこれはcmakeの新しいバージョンで変更されましたが、ここにリファレンスドキュメントがあります:cmake.org/cmake/help/v3.0/module/FindBoost.html
Nick Desaulniers 2015年

2
それは私には機能しません...それはブーストライブラリを見つけますが、コンパイル時に大量のエラーを生成します

1
' BOOST_INCLUDEDIR'ではないですか?
dmedine 2018年

2
@IhorKaharlichenkoですが、BOOST_ROOTはBOOST_ROOTである必要があります。素晴らしい!私はアンダースコアせずに、アンダースコアを持つすべての場合、キャメルケース、すべて大文字、としてみましょう... <顔ヤシ>
ドジャースダック

53

FindBoost.cmakeファイル自体を読むことで利用できるヘルプがさらにあります。'Modules'ディレクトリにあります。

良いスタートはset(Boost_DEBUG 1)、ブーストがどこを探しているのか、何を探しているのかについての多くの情報を吐き出し、なぜそれが見つからないのかを説明するのに役立つかもしれません。

また、BOOST_ROOT適切に検出されているかどうかを判断するのにも役立ちます。

FindBoost.cmakeまた、ブーストの正確なバージョンが使用可能なバージョン変数にリストされていない場合にも問題が発生することがあります。これについて詳しくは、をお読みくださいFindBoost.cmake

最後FindBoost.cmakeに、過去にいくつかのバグがありました。あなたが試すかもしれないことの一つは、新しいバージョンの取ることですFindBoost.cmakeと一緒にCMakeの最新バージョンのうちの、そしてあなたのプロジェクトフォルダにそれを固執するCMakeLists.txtの、あなたはブーストの古いバージョンを持っている場合でも、それは新しいバージョンを使用します-FindBoost.cmakeそれはですプロジェクトのフォルダ。

幸運を。


10

私はしばらくの間、この問題に苦しんでいました。cmakeBoostの命名規則を使用してBoostライブラリファイルを探していたことが判明しました。ライブラリ名は、ライブラリの構築に使用されたコンパイラバージョンの関数です。Boostライブラリはを使用して構築されてGCC 4.9.1おり、そのコンパイラバージョンは実際にシステムに存在していました。しかし、GCC 4.4.7たまたまインストールされていました。たまたま、cmakeのFindBoost.cmakeスクリプトはGCC 4.4.7インストールではなくインストールを自動検出してGCC 4.9.1いたためgcc44、ファイル名に「gcc49」ではなく「」が含まれるBoostライブラリファイルを探していました。

簡単な修正はBoost_COMPILER、で「-gcc49」に設定することにより、cmakeにGCC4.9が存在すると想定させることでしたCMakeLists.txt。この変更によりFindBoost.cmake、Boostライブラリファイルを探して見つけました。


6

正しいバージョンのブーストヘッダーの場所を渡す-DBOOST_INCLUDEDIRかポイントすることで、CMakeで使用するブーストのバージョンを指定することもできます-DBOOST_ROOT

例:

cmake -DBOOST_ROOT=/opt/latestboost

これは、複数のブーストバージョンが同じシステム上にある場合にも役立ちます。


おかげで、それはWindows用のAvroビルドで私のために働いた。
ggurov 2018

5

同様の問題が発生し、BOOST_INCLUDE_DIR、BOOST_LIBRARYDIR、およびBOOST_ROOTの環境変数が絶対パスを保持する必要があることを発見しました。HTH!


はい。BOOST_ROOT環境の相対パスが原因で、同じ問題が発生しました。どうもありがとう!
korst1k

2

makeUbuntu Trusty64にBoostバージョン1.66.0をインストールした後、プロジェクトを実行しようとしたときに同じ問題が発生しました。エラーメッセージは次のようなものでした(まったく同じではありません)。

CMake Error at     
/usr/local/Cellar/cmake/3.3.2/share/cmake/Modules/FindBoost.cmake:1245 (message):
Unable to find the requested Boost libraries.
Boost version: 0.0.0
Boost include path: /usr/include
Detected version of Boost is too old.  Requested version was 1.36 (or newer).
Call Stack (most recent call first):
CMakeLists.txt:10 (FIND_PACKAGE)

Boostは確実にインストールされましたが、CMakeはそれを検出できませんでした。パスと環境変数をいじくり回すのに多くの時間を費やした後、私は最終的にcmake自分自身でオプションをチェックし、次のことを見つけました。

--check-system-vars        = Find problems with variable usage in system files

そこで、問題のディレクトリで次のコマンドを実行しました。

sudo cmake --check-system-vars

戻った:

Also check system files when warning about unused and uninitialized variables.
-- Boost version: 1.66.0
-- Found the following Boost libraries:
--   system
--   filesystem
--   thread
--   date_time
--   chrono
--   regex
--   serialization
--   program_options
-- Found Git: /usr/bin/git
-- Configuring done
-- Generating done
-- Build files have been written to: /home/user/myproject

問題を解決しました。


2

3.1.0-rc2ピックアップするcmakeバージョンについてはboost 1.57-D_boost_TEST_VERSIONS=1.57

cmake version 3.1.0-rc2デフォルトboost<=1.56.0は、-DBoost_DEBUG=ON

cmake -D_boost_TEST_VERSIONS=1.57 -DBoost_DEBUG=ON -DCMAKE_BUILD_TYPE=Debug -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++


2

独自のブーストを構築している--layout=versioned場合は、使用することを忘れないでください。そうしないと、特定のバージョンのライブラリの検索が失敗します。


1

静的にリンクされたBoostを使用して、特にCGALを構築しようとしている人へのもう1つのアドバイス。定義するだけでは不十分Boost_USE_STATIC_LIBSです。Boost_DEBUG値を出力する時間によってオーバーライドされます。ここで行うことは、「詳細」チェックボックスをチェックして有効にすることCGAL_Boost_USE_STATIC_LIBSです。


0

私は同じ問題を抱えていましたが、上記の解決策はどれも機能しませんでした。実際には、ファイルをinclude/boost/version.hpp読み取ることができませんでした(jenkinsによって起動されたcmakeスクリプトによって)。

(ブースト)ライブラリの権限を手動で変更する必要ありました(jenkinsはグループに属していますが、それはjenkinsに関連する別の問題であり、理解できませんでした):

chmod o+wx ${BOOST_ROOT} -R # allow reading/execution on the whole library
#chmod g+wx ${BOOST_ROOT} -R # this did not suffice, strangely, but it is another story I guess

0

これは、CMAKE_FIND_ROOT_PATHがとは異なるように設定されている場合にも発生する可能性がありBOOST_ROOTます。設定にもかかわらずBOOST_ROOT、エラーが発生するのと同じ問題に直面しました。しかし、ARMのクロスコンパイルには、(何らかの理由で)使用していたToolchain-android.cmakeを使用していました。

set(BOOST_ROOT "/home/.../boost")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} --sysroot=${SYSROOT}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --sysroot=${SYSROOT} -I${SYSROOT}/include/libcxx")
set(CMAKE_CXX_LINK_FLAGS "${CMAKE_CXX_LINK_FLAGS}")
set(CMAKE_FIND_ROOT_PATH "${SYSROOT}")

CMAKE_FIND_ROOT_PATHBOOST_ROOT問題を引き起こしていたオーバーライドしているようです。


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