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の内部をいじり回す必要がありますか?
CMakeを掘り下げて実験した後、CMakeは、Boostライブラリがすべて/usr/local/lib/boost
でなく/usr/local/lib
。ソフトリンクを元に戻すと、ビルドは機能しました。
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 .
やっと欲しいものを手に入れることができた
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
必要なのは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} )
通常、最も一般的な間違いは、新しいオプションを追加した後のビルドディレクトリを削除しないです。システムパケットマネージャーから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 *
;))
同様の問題があり、CMakeはベンダーがインストールしたBoostのみを検出しましたが、クラスターには[〜#〜] i [〜#〜]が使用したいローカルにインストールされたバージョンがありました。 Red Hat Linux 6。
とにかく、すべてのBOOSTROOT
、BOOST_ROOT
、およびBoost_DIR
が設定されていない場合は、_Boost_NO_BOOST_CMAKE
(例:cmd行に追加-DBoost_NO_BOOST_CMAKE=TRUE
)。
(マルチプラットフォームでのCMakeの有用性は認めますが、それでも嫌いです。)
ライブラリを見つける場所について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++バージョンマネージャー
私は同様の問題を抱えていたので、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})
私は夕方のほとんどをこれを機能させるために費やしました。 -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いクラッジであることを認めますが、同じレンガの壁に出くわし、それを回避し、仕事を終わらせたい人々のために、ここに置いています。
私も同じ問題に遭遇しましたが、残念ながらここでヒントを試しても助けにはなりませんでした。
唯一助けられたのは、buntu 12.10にBoost 1.50をインストールするの説明に従って、Boostページから最新バージョンをダウンロードし、コンパイルしてインストールすることでした。
私の場合、Boost 1.53を使用しました。
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
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の最新バージョンに依存するライブラリを正常に構築しました。