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それはですプロジェクトのフォルダ。
幸運を。
私はしばらくの間、この問題に苦しんでいました。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ライブラリファイルを探して見つけました。
正しいバージョンのブーストヘッダーの場所を渡す-DBOOST_INCLUDEDIRかポイントすることで、CMakeで使用するブーストのバージョンを指定することもできます-DBOOST_ROOT
例:
cmake -DBOOST_ROOT=/opt/latestboost
これは、複数のブーストバージョンが同じシステム上にある場合にも役立ちます。
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
問題を解決しました。
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_PATHBOOST_ROOT問題を引き起こしていたオーバーライドしているようです。
Boost_INCLUDE_DIRを使用し、他のバージョンはフラグを使用しますBoost_INCLUDEDIR(アンダースコアなし)。あなたは読むことによってあなたのケースのために右のいずれかをチェックすることができるFindBoost.cmakeの下で、ファイルをpath-to-cmake/Modules/FindBoost.cmake