web-dev-qa-db-ja.com

CMakeに代替のBoostインストールを見つけるにはどうすればよいですか?

Boostの最新バージョンを/usr/localにインストールし(/usr/local/include/boostにインクルードし、/usr/local/lib/boostにライブラリを含む)、Wtをソースからインストールしようとしていますが、CMake(バージョン2.6) Boostインストールが見つからないようです。 BOOST_DIRおよびBoost_LIBRARYDIRの設定に関する有用な提案を提供しようとしますが、これらの変数を微調整することで機能させることはできません。

最新のエラーメッセージは、ライブラリが見つからないということですが、インクルードパスに「/ usr/local/include」を使用していることを示しているようです。 tはそれを修正するようです)。これを解決するための解決策はありますか、それともCMakeの内部をいじり回す必要がありますか?

49
BD at Rivenhill

CMakeを掘り下げて実験した後、CMakeは、Boostライブラリがすべて/usr/local/lib/boostでなく/usr/local/lib。ソフトリンクを元に戻すと、ビルドは機能しました。

3
BD at Rivenhill

FindBoost.cmakeスクリプト。Boostの検出とすべての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モジュールによって設定される変数です。 BOake_ROOTを設定するためにCMakeプロジェクトの構成を編集する必要はない(そしておそらくしたくない)ことに注意してください。代わりに、環境変数を使用する必要があります。呼ぶ

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

37
ypnos

やっと欲しいものを手に入れることができた

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
35
Damien Kick

ショートバージョン

必要なのはBOOST_ROOTだけですが、iOSまたはAndroid用の複数のインストールまたはクロスコンパイルがある場合は、ローカルBoostのシステム検索を無効にする必要があります。その場合、add Boost_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" )

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

長いバージョン

公式に言えば 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} )
18

通常、最も一般的な間違いは、新しいオプションを追加した後のビルドディレクトリを削除しないです。システムパケットマネージャーから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

以上です。 Ta bum tss。

しかし、cd build-> cmake ../srcの後に作成すると、システムパスからBoostが設定されます。その後、cmake -DCMAKE_INCLUDE_PATH=$HOME/installs/include -DCMAKE_LIBRARY_PATH=$HOME/installs/lib ../srcを実行しても何も変わりません。

ビルドディレクトリを消去する必要がありますcd build && rm -rf *;))

13
jaor

同様の問題があり、CMakeはベンダーがインストールしたBoostのみを検出しましたが、クラスターには[〜#〜] i [〜#〜]が使用したいローカルにインストールされたバージョンがありました。 Red Hat Linux 6。

とにかく、すべてのBOOSTROOTBOOST_ROOT、およびBoost_DIRが設定されていない場合は、_Boost_NO_BOOST_CMAKE(例:cmd行に追加-DBoost_NO_BOOST_CMAKE=TRUE)。

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

12
user1795638

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

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

  • CMAKE_LIBRARY_PATHおよびLD_LIBRARY_PATHライブラリー用
  • CMAKE_INCLUDE_PATHおよびINCLUDE_PATHを含む

環境変数の1つでBoostファイルを宣言すると、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++バージョンマネージャー

11
Offirmo

私は同様の問題を抱えていたので、CMakeLists.txtファイル:

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})
9
hungptit

私は夕方のほとんどをこれを機能させるために費やしました。 -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インストールをすべてのビルドコマンドに明示的に指定します。最後に、それは働いた。

私はそれがgいクラッジであることを認めますが、同じレンガの壁に出くわし、それを回避し、仕事を終わらせたい人々のために、ここに置いています。

1
Doug S.

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

唯一助けられたのは、buntu 12.10にBoost 1.50をインストールするの説明に従って、Boostページから最新バージョンをダウンロードし、コンパイルしてインストールすることでした。

私の場合、Boost 1.53を使用しました。

1
Samsky

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インストールにOpen MPIが必要かどうかはよくわかりませんが、今のところこれで問題ありません。

Sudo apt-get install libboost-mpi-dev libboost-mpi-python-dev
Sudo apt-get install libboost-graph-parallel-dev
0
rickfoosusa

2つのバージョンのBoostがインストールされているLinuxサーバーで同様の問題が発生しました。 1つは、2018年に古いものとしてカウントされるプリコンパイル済みの1.53.0バージョンです。 /usr/includeおよび/usr/lib64にあります。使用したいバージョンは1.67.0です。インストールする別のC++ライブラリには1.65.1の最小バージョンが必要です。 includeおよびlibサブディレクトリを持つ/opt/boostにあります。前の回答で提案したように、次のようにCMakeLists.txtに変数を設定して、Boost 1.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関連の変数を設定します

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の最新バージョンに依存するライブラリを正常に構築しました。

0
Lambda Moses