web-dev-qa-db-ja.com

CmakeがBoostを見つけられない

CMakeを使用してプロジェクトを構成しようとしていますが、指定されたフォルダーにあるにもかかわらずBoostライブラリを見つけることができません。 Boost_INCLUDE_DIR、Boost_LIBRARYDIR、BOOST_ROOTを指定しましたが、CMakeがBoostを見つけられないというエラーが表示されます。そのようなエラーの原因は何ですか?

69
Ivan Gromov

あなたはそれを正しい方法でやっていると確信していますか?これは、CMakeがBOOST_INCLUDE_DIR、BOOST_LIBRARYDIR、およびBOOST_ROOTを自動的に設定するという考え方です。 CMakeLists.txtで次のようなことを行います。

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

boostがデフォルトの場所にインストールされていないためにcmakeで検出できない場合は、次のようにboostを探す場所をcmakeに指示できます。

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

もちろん、これらの2行はbefore CMakeLists.txtのFIND_PACKAGE(Boost)でなければなりません

89
fschmitt

FindBoost.cmakeファイル自体を読むと、さらにヘルプが利用できます。 「モジュール」ディレクトリにあります。

良いスタートは、設定することです(Boost_DEBUG 1)-これは、ブーストが探している場所、探しているものに関する多くの情報を吐き出し、それが見つからない理由を説明するのに役立ちます。

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

Boostの正確なバージョンがAvailable Versions変数にリストされていない場合、FindBoost.cmakeにも問題が生じることがあります。これについては、FindBoost.cmakeを参照してください。

最後に、FindBoost.cmakeには過去にいくつかのバグがありました。試してみたいことの1つは、最新バージョンのcmakeからFindBoost.cmakeの新しいバージョンを取り出し、CMakeLists.txtと一緒にプロジェクトフォルダーに貼り付けることです。その後、古いバージョンのboostを使用している場合でも、プロジェクトのフォルダーにあるFindBoost.cmakeの新しいバージョン。

幸運を。

42
don bright

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

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

8
Tom P.

-DBOOST_INCLUDEDIRまたは-DBOOST_ROOTに正しいバージョンブーストヘッダーの場所を指定することで、CMakeで使用するBoostのバージョンを指定することもできます。

例:

cmake -DBOOST_ROOT=/opt/latestboost

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

5
Skillachie

同様の問題もあり、BOOST_INCLUDE_DIR、BOOST_LIBRARYDIR、BOOST_ROOTのenv変数はabsoluteパスを保持する必要があることを発見しました。 HTH!

3
sphakka

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

2
Gaetano Mendola

Cmakeバージョン3.1.0-rc2でブースト1.57を選択するには、-D_boost_TEST_VERSIONS = 1.57を指定します

-DBoost_DEBUG = ONを使用して見られるように、cmakeバージョン3.1.0-rc2はデフォルトでboost <= 1.56.0になります

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

1
Simon Allfrey

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

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

そして問題を解決しました。

1
user3006381

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

0
Philip