Ich hatte ein ähnliches Problem, CMake fand nur einen vom Anbieter installierten Boost, aber mein Cluster hatte eine lokal installierte Version, was ich ist wollte es verwenden. Red Hat Linux 6.
Wie auch immer, es sieht aus wie alle BOOSTROOT
, BOOST_ROOT
, und Boost_DIR
Sachen würden sich ärgern, wenn man nicht auch Boost_NO_BOOST_CMAKE
setzt (z. B. zur Befehlszeile -DBoost_NO_BOOST_CMAKE=TRUE
hinzufügen ).
(Ich gebe die Nützlichkeit von CMake für mehrere Plattformen zu, aber ich kann es immer noch hassen.)
Mit
konnte ich endlich bekommen, was ich wolltecmake -DCMAKE_INSTALL_PREFIX=$TARGET \
-DBoost_NO_BOOST_CMAKE=TRUE \
-DBoost_NO_SYSTEM_PATHS=TRUE \
-DBOOST_ROOT:PATHNAME=$TARGET \
-DBoost_LIBRARY_DIRS:FILEPATH=${TARGET}/lib
Die Kurzversion
Sie brauchen nur BOOST_ROOT
, aber Sie sollten das Durchsuchen des Systems nach Ihrem lokalen Boost deaktivieren, wenn Sie mehrere Installationen oder Cross-Compiling für iOS oder Android haben. Fügen Sie in diesem Fall Boost_NO_SYSTEM_PATHS
hinzu auf false gesetzt ist.
set( BOOST_ROOT "" CACHE PATH "Boost library path" )
set( Boost_NO_SYSTEM_PATHS on CACHE BOOL "Do not search system for Boost" )
Normalerweise wird dies auf der CMake-Befehlszeile mit der Syntax -D<VAR>=value
übergeben .
Die längere Version
Offiziell heißt es auf der FindBoost-Seite, dass diese Variablen verwendet werden sollten, um den Standort von Boost anzuzeigen.
Dieses Modul liest Hinweise zu Suchpositionen aus Variablen:
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)
Dies ergibt eine theoretisch korrekte Beschwörung:
cmake -DBoost_NO_SYSTEM_PATHS=TRUE \
-DBOOST_ROOT=/path/to/boost-dir
Wenn Sie aus dem Quellcode kompilieren
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} )
Wenn Sie dann dieses Skript aufrufen, müssen Sie das Skript boost.cmake einbinden (meins befindet sich im Unterverzeichnis a), die Header einschließen, die Abhängigkeit angeben und die Bibliotheken verlinken.
include( boost )
include_directories( ${boost_INCLUDE_DIR} )
add_dependencies( MyProject boost )
target_link_libraries( MyProject
${Boost_LIBRARIES} )
Sie sollten sich FindBoost.cmake
ansehen -Skript, das die Boost-Erkennung und die Einrichtung aller Boost-Variablen übernimmt. Es befindet sich normalerweise in /usr/share/cmake-2.6/Modules/
. Darin finden Sie eine Dokumentation. Zum Beispiel:
# 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.
#
Im Gegensatz zu BOOST_ROOT handelt es sich bei den Variablen, auf die Sie sich beziehen, tatsächlich um Variablen, die vom FindBoost-Modul festgelegt werden. Beachten Sie, dass Sie Ihre CMake-Projektkonfiguration nicht bearbeiten müssen (und wahrscheinlich auch nicht wollen), um BOOST_ROOT festzulegen. Stattdessen sollten Sie die Umgebungsvariable verwenden, z. anrufen
# BOOST_ROOT=/usr/local/... ccmake .