CMakeを使用してプロジェクトを構成しようとしていますが、指定されたフォルダーにあるにもかかわらず、Boostライブラリが見つかりません。私が指定されているBoost_INCLUDE_DIR
、Boost_LIBRARYDIR
とBOOST_ROOT
、私はまだcmakeのは、ブーストを見つけることができないというエラーを取得します。そのようなエラーの理由は何でしょうか?
回答:
あなたはそれを正しい方法でやっていると確信していますか?アイデアは、その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()
ブーストがデフォルトの場所にインストールされておらず、したがって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
ます。
${Boost_INCLUDE_DIR}
ません${BOOST_INCLUDE_DIR}
、ケースは重要です。
BOOST_INCLUDEDIR
'ではないですか?
FindBoost.cmake
ファイル自体を読むことで利用できるヘルプがさらにあります。'Modules'ディレクトリにあります。
良いスタートはset(Boost_DEBUG 1)
、ブーストがどこを探しているのか、何を探しているのかについての多くの情報を吐き出し、なぜそれが見つからないのかを説明するのに役立つかもしれません。
また、BOOST_ROOT
適切に検出されているかどうかを判断するのにも役立ちます。
FindBoost.cmake
また、ブーストの正確なバージョンが使用可能なバージョン変数にリストされていない場合にも問題が発生することがあります。これについて詳しくは、をお読みくださいFindBoost.cmake
。
最後FindBoost.cmake
に、過去にいくつかのバグがありました。あなたが試すかもしれないことの一つは、新しいバージョンの取ることですFindBoost.cmake
と一緒にCMakeの最新バージョンのうちの、そしてあなたのプロジェクトフォルダにそれを固執するCMakeLists.txt
の、あなたはブーストの古いバージョンを持っている場合でも、それは新しいバージョンを使用します-FindBoost.cmake
それはですプロジェクトのフォルダ。
幸運を。
私はしばらくの間、この問題に苦しんでいました。cmake
Boostの命名規則を使用して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ライブラリファイルを探して見つけました。
正しいバージョンのブーストヘッダーの場所を渡す-DBOOST_INCLUDEDIR
かポイントすることで、CMakeで使用するブーストのバージョンを指定することもできます-DBOOST_ROOT
例:
cmake -DBOOST_ROOT=/opt/latestboost
これは、複数のブーストバージョンが同じシステム上にある場合にも役立ちます。
make
Ubuntu 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
問題を解決しました。
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++
私は同じ問題を抱えていましたが、上記の解決策はどれも機能しませんでした。実際には、ファイルを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
これは、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_PATH
BOOST_ROOT
問題を引き起こしていたオーバーライドしているようです。
Boost_INCLUDE_DIR
を使用し、他のバージョンはフラグを使用しますBoost_INCLUDEDIR
(アンダースコアなし)。あなたは読むことによってあなたのケースのために右のいずれかをチェックすることができるFindBoost.cmake
の下で、ファイルをpath-to-cmake/Modules/FindBoost.cmake