Tuve un problema similar, CMake solo encontró un Boost instalado por el proveedor, pero mi clúster tenía una versión instalada localmente, que es lo que yo quería que lo usara. Red Hat Linux 6.
De todos modos, parece que todos los BOOSTROOT
, BOOST_ROOT
y Boost_DIR
las cosas se molestarían a menos que uno también establezca Boost_NO_BOOST_CMAKE
(por ejemplo, agregar a la línea cmd -DBoost_NO_BOOST_CMAKE=TRUE
).
(Concederé la utilidad de CMake para multiplataforma, pero aún puedo odiarlo).
Finalmente pude obtener lo que quería con
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
La versión corta
Solo necesitas BOOST_ROOT
, pero querrá deshabilitar la búsqueda en el sistema de su Boost local si tiene varias instalaciones o compilación cruzada para iOS o Android. En cuyo caso agregue Boost_NO_SYSTEM_PATHS
se establece en falso.
set( BOOST_ROOT "" CACHE PATH "Boost library path" )
set( Boost_NO_SYSTEM_PATHS on CACHE BOOL "Do not search system for Boost" )
Normalmente esto se pasa en la línea de comandos de CMake usando la sintaxis -D<VAR>=value
.
La versión más larga
Hablando oficialmente, la página de FindBoost establece que estas variables deben usarse para "indicar" la ubicación de Boost.
Este módulo lee sugerencias sobre ubicaciones de búsqueda de variables:
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)
Esto hace un conjuro teóricamente correcto:
cmake -DBoost_NO_SYSTEM_PATHS=TRUE \
-DBOOST_ROOT=/path/to/boost-dir
Cuando compilas desde la fuente
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} )
Luego, cuando llame a este script, deberá incluir el script boost.cmake (el mío está en el subdirectorio a), incluir los encabezados, indicar la dependencia y vincular las bibliotecas.
include( boost )
include_directories( ${boost_INCLUDE_DIR} )
add_dependencies( MyProject boost )
target_link_libraries( MyProject
${Boost_LIBRARIES} )
Deberías echar un vistazo a FindBoost.cmake
script, que maneja la detección de Boost y la configuración de todas las variables de Boost. Normalmente reside en /usr/share/cmake-2.6/Modules/
. En él encontrarás documentación. Por ejemplo:
# 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.
#
A diferencia de BOOST_ROOT, las variables a las que se refiere son en realidad variables configuradas por el módulo FindBoost. Tenga en cuenta que no tiene que (y probablemente tampoco quiera) editar la configuración de su proyecto CMake para configurar BOOST_ROOT. En su lugar, debe usar la variable de entorno, p. llamando
# BOOST_ROOT=/usr/local/... ccmake .