Měl jsem podobný problém, CMake našel pouze Boost nainstalovaný dodavatelem, ale můj cluster měl lokálně nainstalovanou verzi, což já chtěl to použít. Red Hat Linux 6.
Každopádně to vypadá jako všechny BOOSTROOT
, BOOST_ROOT
a Boost_DIR
věci by se rozčilovaly, pokud by člověk nenastavil také Boost_NO_BOOST_CMAKE
(např. přidejte na řádek cmd -DBoost_NO_BOOST_CMAKE=TRUE
).
(Připouštím užitečnost CMake pro multiplatformní systémy, ale stále ho mohu nenávidět.)
Konečně jsem mohl získat to, co jsem chtěl s
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
Krátká verze
Potřebujete pouze BOOST_ROOT
, ale pokud máte více instalací nebo křížovou kompilaci pro iOS nebo Android, budete chtít zakázat vyhledávání v systému pro místní Boost. V takovém případě přidejte Boost_NO_SYSTEM_PATHS
je nastaveno na hodnotu false.
set( BOOST_ROOT "" CACHE PATH "Boost library path" )
set( Boost_NO_SYSTEM_PATHS on CACHE BOOL "Do not search system for Boost" )
Normálně se to předává na příkazovém řádku CMake pomocí syntaxe -D<VAR>=value
.
Delší verze
Oficiálně řečeno, stránka FindBoost uvádí, že tyto proměnné by měly být použity k „nápovědě“ umístění Boostu.
Tento modul čte rady ohledně hledání umístění z proměnných:
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)
To dělá teoreticky správné zaklínadlo:
cmake -DBoost_NO_SYSTEM_PATHS=TRUE \
-DBOOST_ROOT=/path/to/boost-dir
Když kompilujete ze zdroje
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} )
Když pak zavoláte tento skript, budete muset zahrnout skript boost.cmake (můj je v podadresáři a), zahrnout záhlaví, označit závislost a propojit knihovny.
include( boost )
include_directories( ${boost_INCLUDE_DIR} )
add_dependencies( MyProject boost )
target_link_libraries( MyProject
${Boost_LIBRARIES} )
Měli byste se podívat na FindBoost.cmake
skript, který se stará o detekci Boost a nastavení všech proměnných Boost. Obvykle se nachází v /usr/share/cmake-2.6/Modules/
. V něm najdete dokumentaci. Například:
# 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.
#
Na rozdíl od BOOST_ROOT jsou proměnné, na které odkazujete, ve skutečnosti proměnné, které nastavuje modul FindBoost. Všimněte si, že pro nastavení BOOST_ROOT nemusíte (a pravděpodobně ani nechcete) upravovat konfiguraci projektu CMake. Místo toho byste měli použít proměnnou prostředí, např. volání
# BOOST_ROOT=/usr/local/... ccmake .