70

最新バージョンのBoostin /usr/local(includesin/usr/local/include/boost/usr/local/lib/boostlibraryin)をインストールし、ソースからWtをインストールしようとしていますが、CMake(バージョン2.6)がBoostインストールを見つけられないようです。BOOST_DIRとBoost_LIBRARYDIRの設定について役立つ提案をしようとしますが、これらの変数を調整して機能させることができませんでした。

私が受け取った最新のエラーメッセージは、ライブラリが見つからないというものですが、インクルードパスに「/ usr / local / include」を使用していることを示しているようです。これは正しくありません(そして私はできます) tはそれを修正するようです)。彼らの頭のてっぺんからこれに対する解決策はありますか、それとも私はそれを理解するためにCMakeの中でいじくり回す必要がありますか?

4

15 に答える 15

48

FindBoost.cmakeBoostの検出とすべてのBoost変数の設定を処理するスクリプトを確認する必要があります。通常はにあります/usr/share/cmake-2.6/Modules/。その中に、ドキュメントがあります。例えば:

# These last three variables are available also as environment variables:
#
#   BOOST_ROOT or BOOSTROOT      The preferred installation prefix for searching for
#                                Boost.  Set this if the module has problems finding
#                                the proper Boost installation.
#

BOOST_ROOTとは対照的に、参照している変数は、実際にはFindBoostモジュールによって設定される変数です。BOOST_ROOTを設定するためにCMakeプロジェクト構成を編集する必要はない(そしておそらく編集したくない)ことに注意してください。代わりに、環境変数を使用する必要があります。

# BOOST_ROOT=/usr/local/... ccmake .

于 2010-06-10T16:45:45.090 に答える
41

やっと欲しいものが手に入る

cmake -DCMAKE_INSTALL_PREFIX=$TARGET \
    -DBoost_NO_BOOST_CMAKE=TRUE \
    -DBoost_NO_SYSTEM_PATHS=TRUE \
    -DBOOST_ROOT:PATHNAME=$TARGET \
    -DBoost_LIBRARY_DIRS:FILEPATH=${TARGET}/lib
于 2013-06-11T17:04:29.193 に答える
27

ショートバージョン

必要なのはだけBOOST_ROOTですが、iOSまたはAndroidで複数のインストールまたはクロスコンパイルを行う場合は、システムでローカルBoostを検索することを無効にする必要があります。この場合、addBoost_NO_SYSTEM_PATHSはfalseに設定されます。

set( BOOST_ROOT "" CACHE PATH "Boost library path" )
set( Boost_NO_SYSTEM_PATHS on CACHE BOOL "Do not search system for Boost" )

通常、これは構文を使用してCMakeコマンドラインで渡されます-D<VAR>=value

長いバージョン

公式に言えば、FindBoostページには、Boostの場所を「ヒント」するためにこれらの変数を使用する必要があると記載されています。

このモジュールは、変数から検索場所に関するヒントを読み取ります。

BOOST_ROOT             - Preferred installation prefix
 (or BOOSTROOT)
BOOST_INCLUDEDIR       - Preferred include directory e.g. <prefix>/include
BOOST_LIBRARYDIR       - Preferred library directory e.g. <prefix>/lib
Boost_NO_SYSTEM_PATHS  - Set to ON to disable searching in locations not
                         specified by these hint variables. Default is OFF.
Boost_ADDITIONAL_VERSIONS
                       - List of Boost versions not known to this module
                         (Boost install locations may contain the version)

これにより、理論的に正しい呪文が作成されます。

cmake -DBoost_NO_SYSTEM_PATHS=TRUE \
      -DBOOST_ROOT=/path/to/boost-dir

ソースからコンパイルする場合

include( ExternalProject )

set( boost_URL "http://sourceforge.net/projects/boost/files/boost/1.63.0/boost_1_63_0.tar.bz2" )
set( boost_SHA1 "9f1dd4fa364a3e3156a77dc17aa562ef06404ff6" )
set( boost_INSTALL ${CMAKE_CURRENT_BINARY_DIR}/third_party/boost )
set( boost_INCLUDE_DIR ${boost_INSTALL}/include )
set( boost_LIB_DIR ${boost_INSTALL}/lib )

ExternalProject_Add( boost
        PREFIX boost
        URL ${boost_URL}
        URL_HASH SHA1=${boost_SHA1}
        BUILD_IN_SOURCE 1
        CONFIGURE_COMMAND
        ./bootstrap.sh
        --with-libraries=filesystem
        --with-libraries=system
        --with-libraries=date_time
        --prefix=<INSTALL_DIR>
        BUILD_COMMAND
        ./b2 install link=static variant=release threading=multi runtime-link=static
        INSTALL_COMMAND ""
        INSTALL_DIR ${boost_INSTALL} )

set( Boost_LIBRARIES
        ${boost_LIB_DIR}/libboost_filesystem.a
        ${boost_LIB_DIR}/libboost_system.a
        ${boost_LIB_DIR}/libboost_date_time.a )
message( STATUS "Boost static libs: " ${Boost_LIBRARIES} )

次に、このスクリプトを呼び出すときに、boost.cmakeスクリプト(私のものはサブディレクトリにあります)を含め、ヘッダーを含め、依存関係を示し、ライブラリをリンクする必要があります。

include( boost )
include_directories( ${boost_INCLUDE_DIR} )
add_dependencies( MyProject boost )
target_link_libraries( MyProject
                       ${Boost_LIBRARIES} )
于 2016-10-12T13:35:01.043 に答える
19

同様の問題があり、CMakeはベンダーがインストールしたBoostのみを見つけましたが、クラスターにはローカルにインストールされたバージョンがあり、それを使用したいと思っていました。Red HatLinux6。

とにかく、設定しない限り、、、、およびすべてBOOSTROOTのものが煩わしいように見えます(たとえば、cmd行に追加)。BOOST_ROOTBoost_DIRBoost_NO_BOOST_CMAKE-DBoost_NO_BOOST_CMAKE=TRUE

(マルチプラットフォームでのCMakeの有用性を認めますが、それでも嫌いです。)

于 2012-11-02T23:02:40.123 に答える
15

一般的に最も一般的な間違いは、新しいオプションを追加した後にビルドディレクトリをクリーンアップしないことです。システムパケットマネージャーからBoostをインストールしました。そのバージョンは1.49です。

また、Boost 1.53をダウンロードし、の下に「インストール」しました$HOME/installs

私のプロジェクトで私がしなければならなかった唯一のことは(私はソースを保持しているmy_project_directory/src)ことでした:

cd my_project_directory
mkdir build
cd build
cmake -DCMAKE_INCLUDE_PATH=$HOME/installs/include -DCMAKE_LIBRARY_PATH=$HOME/installs/lib ../src

以上です。Tabumtss。

しかし、後で作成すると、システムパスからBoostが設定されますcd buildcmake ../srcそうcmake -DCMAKE_INCLUDE_PATH=$HOME/installs/include -DCMAKE_LIBRARY_PATH=$HOME/installs/lib ../srcすれば何も変わりません。

ビルドディレクトリをクリーンアップする必要がありますcd build && rm -rf *;))

于 2013-06-28T06:25:18.247 に答える
15

同様の問題が発生しました。CMakeLists.txtファイルに次の行を追加することで、カスタマイズされたBoostライブラリを使用できます。

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 REQUIRED regex date_time system filesystem thread graph program_options)
include_directories(${BOOST_INCLUDE_DIRS})
于 2015-01-26T18:32:36.947 に答える
12

ライブラリを見つける場所についてCMakeに指示を与える一般的な方法があります。

ライブラリを探すとき、CMakeは最初に次の変数を調べます。

  • CMAKE_LIBRARY_PATHLD_LIBRARY_PATH図書館のために
  • CMAKE_INCLUDE_PATHINCLUDE_PATH含む

ブーストファイルを環境変数の1つで宣言すると、CMakeはそれを見つけます。例:

export CMAKE_LIBRARY_PATH="/stuff/lib.boost.1.52/lib:$CMAKE_LIBRARY_PATH"
export CMAKE_INCLUDE_PATH="/stuff/lib.boost.1.52/include:$CMAKE_INCLUDE_PATH"

面倒な場合は、私が書いた、すべてを実行する優れたインストールツールを使用することもできます:C++バージョンマネージャー

于 2012-12-13T14:46:28.333 に答える
3

CMakeを調べて実験した後、CMakeは、Boostライブラリがすべて含まれているのに含まれ/usr/local/lib/boostていないという事実に不満を持っていると判断しました/usr/local/lib。それらをソフトリンクして戻すと、ビルドは機能しました。

于 2010-06-12T12:48:11.377 に答える
2

私はこれを機能させるために私の夜のほとんどを過ごしました。-DBOOST_ *&cをすべて試しました。CMakeを使用したディレクティブですが、ビルド領域を繰り返しクリアして再構成した後でも、システムのBoostライブラリにリンクし続けました。

最後に、生成されたMakefileを変更し、cmake_check_build_systemターゲットを無効にして('echo ""'など)何もしないようにして、makeを実行したときに変更が上書きされないようにしてから、' grep -rl "lboost_python" * | xargs sed -i "s:-lboost_python:-L / opt / sw / gcc5 / usr / lib / -lboost_python:g'をbuild/ディレクトリに配置して、使用したいBoostインストールにすべてのビルドコマンドを明示的に指定します。最後に、それはうまくいきました。

私はそれが醜い恨みであることを認めますが、同じレンガの壁にぶつかり、それを回避して仕事をやりたいと思っている人々のために、ここにそれを置いています。

于 2017-02-12T20:36:29.843 に答える
1

私も同じ問題に遭遇しましたが、残念ながら、ここでヒントを試しても役に立ちませんでした。

唯一助けになったのは、Boostページから最新バージョンをダウンロードし、Ubuntu12.10へのBoost1.50のインストールの説明に従ってコンパイルしてインストールすることでした。

私の場合、Boost1.53を使用しました。

于 2013-05-23T10:59:31.813 に答える
1

CMakeでは、以下を追加できますCMakelists

# install boost by apt-get method
include_directories(BEFORE SYSTEM "/usr/include") 

#  or install by building from src
# include_directories(BEFORE SYSTEM "/usr/local/include") 

この方法は私のサーバーの月を節約しました。あなたはそれを試すことができます。ちなみに、一時的な解決策として、予期しないディレクトリの名前を次のように変更できます。

sudo mv /usr/local/include/boost /usr/local/include/boost_bak

うまくいけば、それは私のような深刻な問題を抱えている人々を助けるでしょう。

于 2020-06-11T04:07:27.260 に答える
0

configureはBoostインストールを見つけることができましたが、CMakeは見つけることができませんでした。

FindBoost.cmakeを見つけ、LIBRARY_HINTSを探して、探しているサブパッケージを確認します。私の場合、MPIとグラフライブラリが必要でした。

 # Compute component-specific hints.
  set(_Boost_FIND_LIBRARY_HINTS_FOR_COMPONENT "")
  if(${COMPONENT} STREQUAL "mpi" OR ${COMPONENT} STREQUAL "mpi_python" OR
     ${COMPONENT} STREQUAL "graph_parallel")
    foreach(lib ${MPI_CXX_LIBRARIES} ${MPI_C_LIBRARIES})
      if(IS_ABSOLUTE "${lib}")
        get_filename_component(libdir "${lib}" PATH)
        string(REPLACE "\\" "/" libdir "${libdir}")
        list(APPEND _Boost_FIND_LIBRARY_HINTS_FOR_COMPONENT ${libdir})
      endif()
    endforeach()
  endif()

apt-cache search ...コードをビルドしていたので、devパッケージをインストールしましたが、devパッケージはすべての依存関係をドラッグします。標準のBoostインストールにOpenMPIが必要かどうかはわかりませんが、今のところ問題ありません。

sudo apt-get install libboost-mpi-dev libboost-mpi-python-dev
sudo apt-get install libboost-graph-parallel-dev
于 2016-02-25T20:29:17.030 に答える
0

2つのバージョンのBoostがインストールされているLinuxサーバーで同様の問題が発生しました。1つはプリコンパイルされた1.53.0バージョンで、2018年には古いものとしてカウントされます。に/usr/includeあり/usr/lib64ます。インストールする別のC++ライブラリには1.65.1の最小バージョンが必要なので、使用したいバージョンは1.67.0です。に/opt/boostありincludelibサブディレクトリがあります。以前の回答で示唆されているように、私CMakeLists.txtは次のようにBoost1.67.0を探す場所を指定するために変数を設定しました

include_directories(/opt/boost/include/)
include_directories(/opt/boost/lib/)
set(BOOST_ROOT /opt/boost/)
set(BOOST_INCLUDEDIR /opt/boost/include/)
set(BOOST_LIBRARYDIR /opt/boost/lib)
set(Boost_NO_SYSTEM_PATHS TRUE)
set(Boost_NO_BOOST_CMAKE TRUE)

しかし、CMakeはそれらの変更を尊重しません。次に、オンラインで記事を見つけました。CMakeはローカルのBoostを使用でき、の変数を変更する必要があることに気付きましたCMakeCache.txt。そこで、Boost関連の変数がまだデフォルトのBoost 1.53.0を指していることがわかりました。そのため、CMakeがでの変更を尊重しないのも不思議ではありませんCMakeLists.txt。次に、ブースト関連の変数をで設定しますCMakeCache.txt

Boost_DIR:PATH=Boost_DIR-NOTFOUND
Boost_INCLUDE_DIR:PATH=/opt/boost/include/
Boost_LIBRARY_DIR_DEBUG:PATH=/opt/boost/lib
Boost_LIBRARY_DIR_RELEASE:PATH=/opt/boost/lib

また、Boostライブラリのヘッダー以外のコンパイル済み部分を指す変数を変更して、必要なバージョンを指すようにしました。その後、CMakeはBoostの最新バージョンに依存するライブラリを正常に構築しました。

于 2018-08-18T00:10:02.080 に答える
0

環境変数Boost_INCLUDE_DIRを追加するか、cmakeコマンド-DBoost_INCLUDE_DIRに追加して、インクルードフォルダーをポイントします。

于 2021-01-19T11:31:34.513 に答える
0

私も同じ問題を抱えていました。私のアプローチは、環境変数を介して使用するバージョン(存在する場合)を定義することでした。

# Use speficic version if BOOST_VER environment variable is defined
if(NOT "$ENV{BOOST_VER}" STREQUAL "")
    find_package (Boost "$ENV{BOOST_VER}" EXACT COMPONENTS system unit_test_framework log log_setup filesystem thread REQUIRED)
else()
    # Use default version
    find_package (Boost COMPONENTS system unit_test_framework log log_setup filesystem thread REQUIRED)
endif()

于 2021-07-08T13:44:45.990 に答える