GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo puedo hacer que CMake encuentre mi instalación alternativa de Boost?

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 .


Linux
  1. ¿Cómo puedo encontrar la versión de Fedora que uso?

  2. ¿Cómo puedo hacer que `find` ignore los directorios .svn?

  3. ¿Cómo puedo configurar el 'backend' en matplotlib en Python?

  4. ¿Cómo puedo crear un archivo en cada carpeta?

  5. ¿Cómo puedo ejecutar dos2unix en un directorio completo?

Cómo encontrar/obtener su dirección IP en Linux

Cómo encontrar la fecha y hora de instalación del sistema operativo Linux

¿Cómo puedo convertir espacios en pestañas en Vim o Linux?

¿Cómo puedo obtener una configuración oh-my-zsh segura para todo el sistema?

¿Cómo puedo encontrar el archivo más antiguo en un árbol de directorios?

¿Cómo puedo encontrar las interfaces de red disponibles?