GNU/Linux >> Tutoriels Linux >  >> Linux

Comment puis-je faire en sorte que CMake trouve mon installation Boost alternative ?

J'ai eu un problème similaire, CMake ne trouvant qu'un Boost installé par le fournisseur, mais mon cluster avait une version installée localement, ce que I voulait l'utiliser. Red Hat Linux 6.

Quoi qu'il en soit, il ressemble à tous les BOOSTROOT , BOOST_ROOT , et Boost_DIR les choses seraient ennuyées à moins que l'on ne définisse également Boost_NO_BOOST_CMAKE (par exemple ajouter à la ligne cmd -DBoost_NO_BOOST_CMAKE=TRUE ).

(Je concéderai l'utilité de CMake pour le multiplateforme, mais je peux toujours le détester.)


J'ai enfin pu obtenir ce que je voulais avec

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 version courte

Vous n'avez besoin que de BOOST_ROOT , mais vous voudrez désactiver la recherche du système pour votre Boost local si vous avez plusieurs installations ou une compilation croisée pour iOS ou Android. Auquel cas ajouter Boost_NO_SYSTEM_PATHS est défini sur faux.

set( BOOST_ROOT "" CACHE PATH "Boost library path" )
set( Boost_NO_SYSTEM_PATHS on CACHE BOOL "Do not search system for Boost" )

Normalement, cela est passé sur la ligne de commande CMake en utilisant la syntaxe -D<VAR>=value .

La version longue

Officiellement, la page FindBoost indique que ces variables doivent être utilisées pour "indiquer" l'emplacement de Boost.

Ce module lit des indices sur les emplacements de recherche à partir 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)

Cela fait une incantation théoriquement correcte :

cmake -DBoost_NO_SYSTEM_PATHS=TRUE \
      -DBOOST_ROOT=/path/to/boost-dir

Lorsque vous compilez à partir des sources

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} )

Ensuite, lorsque vous appelez ce script, vous devez inclure le script boost.cmake (le mien se trouve dans le sous-répertoire a), inclure les en-têtes, indiquer la dépendance et lier les bibliothèques.

include( boost )
include_directories( ${boost_INCLUDE_DIR} )
add_dependencies( MyProject boost )
target_link_libraries( MyProject
                       ${Boost_LIBRARIES} )

Vous devriez jeter un œil à FindBoost.cmake script, qui gère la détection de Boost et la configuration de toutes les variables Boost. Il réside généralement dans /usr/share/cmake-2.6/Modules/ . Vous y trouverez de la documentation. Par exemple :

# 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.
#

Contrairement à BOOST_ROOT, les variables auxquelles vous faites référence sont en fait des variables définies par le module FindBoost. Notez que vous n'avez pas à (et ne voulez probablement pas non plus) modifier la configuration de votre projet CMake pour définir BOOST_ROOT. Au lieu de cela, vous devez utiliser la variable d'environnement, par ex. appelant

# BOOST_ROOT=/usr/local/... ccmake .


Linux
  1. Comment définir un paramètre facultatif ? ?

  2. Comment puis-je faire en sorte que `find` ignore les répertoires .svn ?

  3. Comment puis-je obtenir l'état du clavier sous Linux?

  4. Comment puis-je définir le 'backend' dans matplotlib en Python?

  5. Comment puis-je créer un fichier dans chaque dossier ?

Comment trouver/obtenir votre adresse IP sous Linux

Comment trouver la date et l'heure d'installation du système d'exploitation Linux

Comment puis-je convertir des espaces en tabulations dans Vim ou Linux ?

Comment puis-je trouver tous les fichiers liés en dur sur un système de fichiers ?

Comment puis-je trouver le fichier le plus ancien dans une arborescence de répertoires

Comment puis-je migrer une installation Linux du HDD vers le SSD ?