web-dev-qa-db-fra.com

Comment puis-je demander à CMake de trouver mon autre installation Boost?

J'ai installé la version la plus récente de Boost dans /usr/local (avec includes dans /usr/local/include/boost et les bibliothèques dans /usr/local/lib/boost) et j'essaie maintenant d'installer Wt à partir du source, mais CMake (version 2.6) ne semble pas pouvoir trouver l'installation Boost. Il essaie de donner des suggestions utiles sur la définition de BOOST_DIR et de Boost_LIBRARYDIR, mais je n'ai pas réussi à le faire fonctionner en modifiant ces variables.

Le message d'erreur le plus récent que j'ai reçu est qu'il ne peut pas trouver les bibliothèques, mais il semble indiquer qu'il utilise "/ usr/local/include" pour le chemin d'inclusion, ce qui n'est pas correct (et je peux t semblent le réparer). Y a-t-il une solution à leur problème, ou dois-je aller dans CMake pour comprendre?

45
BD at Rivenhill

Après avoir fouillé et expérimenté dans CMake, j'ai constaté que CMake n'était pas satisfait du fait que toutes mes bibliothèques Boost étaient contenues dans /usr/local/lib/boost et non /usr/local/lib. Une fois que je les ai reliées en douceur, la compilation a fonctionné.

3
BD at Rivenhill

Vous devriez consulter le script FindBoost.cmake, qui gère la détection 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 réalité des variables définies par le module FindBoost. Notez qu'il n'est pas nécessaire (et probablement pas aussi) de modifier la configuration de votre projet CMake pour définir BOOST_ROOT. Au lieu de cela, vous devez utiliser la variable d’environnement, par exemple: appel

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

35
ypnos

J'ai finalement 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
33
Damien Kick

La version courte

Vous avez seulement besoin de BOOST_ROOT, mais vous allez vouloir désactiver la recherche du Boost local dans le système si vous avez plusieurs installations ou la compilation croisée pour iOS ou Android. Dans ce cas, add Boost_NO_SYSTEM_PATHS est défini sur false.

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

Normalement, ceci 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 la position de Boost.

Ce module lit des astuces 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

Quand 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 est dans le sous-répertoire a), inclure les en-têtes, indiquer la dépendance et relier les bibliothèques.

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

Généralement, l'erreur la plus courante est ne pas nettoyer votre répertoire de construction après avoir ajouté de nouvelles options. J'ai installé Boost à partir du gestionnaire de paquets système. Sa version est 1.49.

J'ai également téléchargé Boost 1.53 et je l'ai "installé" sous $HOME/installs.

La seule chose que je devais faire dans mon projet était de (je garde les sources dans my_project_directory/src):

cd my_project_directory
mkdir build
cd build
cmake -DCMAKE_INCLUDE_PATH=$HOME/installs/include -DCMAKE_LIBRARY_PATH=$HOME/installs/lib ../src

Et c'est tout. Ta bum tss.

Mais si je faisais après cd build -> cmake ../src, cela définirait Boost à partir du chemin système. Alors, faire cmake -DCMAKE_INCLUDE_PATH=$HOME/installs/include -DCMAKE_LIBRARY_PATH=$HOME/installs/lib ../src ne changerait rien.

Vous devez nettoyer votre répertoire de construction (cd build && rm -rf *;))

12
jaor

J'ai eu un problème similaire, CMake trouvant uniquement un Boost installé par le fournisseur, mais mon cluster disposait d'une version installée localement qui correspond à ce queIvoulait utiliser. Red Hat Linux 6.

Quoi qu'il en soit, il semble que tous les éléments BOOSTROOT, BOOST_ROOT et Boost_DIR soient agacés, sauf si vous définissez également Boost_NO_BOOST_CMAKE (par exemple, ajoutez à la ligne de commande -DBoost_NO_BOOST_CMAKE=TRUE).

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

12
user1795638

Il existe une méthode générique pour indiquer à CMake où trouver les bibliothèques.

Lorsque vous recherchez une bibliothèque, CMake examine en premier les variables suivantes:

  • CMAKE_LIBRARY_PATH et LD_LIBRARY_PATH pour les bibliothèques
  • CMAKE_INCLUDE_PATH et INCLUDE_PATH pour includes

Si vous déclarez vos fichiers Boost dans l’une des variables d’environnement, CMake le trouvera. Exemple:

export CMAKE_LIBRARY_PATH="/stuff/lib.boost.1.52/lib:$CMAKE_LIBRARY_PATH"
export CMAKE_INCLUDE_PATH="/stuff/lib.boost.1.52/include:$CMAKE_INCLUDE_PATH"

Si cela est trop encombrant, vous pouvez également utiliser un outil d’installation de Nice que j’ai écrit et qui fera tout pour vous: Gestionnaire de version C++

11
Offirmo

J'avais un problème similaire et je pouvais utiliser des bibliothèques Boost personnalisées en ajoutant les lignes ci-dessous à mon fichier CMakeLists.txt:

set(Boost_NO_SYSTEM_PATHS TRUE)
if (Boost_NO_SYSTEM_PATHS)
  set(BOOST_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/../../3p/boost")
  set(BOOST_INCLUDE_DIRS "${BOOST_ROOT}/include")
  set(BOOST_LIBRARY_DIRS "${BOOST_ROOT}/lib")
endif (Boost_NO_SYSTEM_PATHS)
find_package(Boost REQUIRED regex date_time system filesystem thread graph program_options)
include_directories(${BOOST_INCLUDE_DIRS})
9
hungptit

J'ai passé la majeure partie de ma soirée à essayer de faire fonctionner cela. J'ai essayé tous les -DBOOST_ * & c. directives avec CMake, mais il continuait à se relier à mes bibliothèques système Boost, même après avoir effacé et reconfiguré à plusieurs reprises ma zone de construction. 

À la fin, j'ai modifié le fichier Makefile généré et ai annulé l'objectif de cmake_check_build_system de ne rien faire (comme 'echo ""') afin d'éviter d'écraser mes modifications lorsque j'exécutais make, puis de "grep -rl" lboost_python "*" | xargs sed -i "s: -lboost_python: -L/opt/sw/gcc5/usr/lib/-lboost_python: g 'dans mon répertoire build/pour indiquer explicitement toutes les commandes de compilation à l'installation Boost que je souhaitais utiliser. Enfin , ça a marché. 

Je reconnais que c’est un moche kludge, mais je ne fais que le publier ici pour le bénéfice de ceux qui se heurtent au même mur de briques et veulent simplement contourner le problème et faire en sorte que le travail soit effectué. 

1
Doug S.

J'ai également rencontré le même problème, mais essayer les astuces ici n'a pas aidé, malheureusement.

La seule chose qui a aidé a été de télécharger la dernière version de la page Boost, de la compiler et de l’installer en tant que Décrite dans - Installation de Boost 1.50 sur Ubuntu 12.10.

Dans mon cas, j'ai travaillé avec Boost 1.53.

1
Samsky

Bien que configure puisse trouver mon installation Boost, CMake n’a pas pu.

Localisez FindBoost.cmake et recherchez LIBRARY_HINTS pour voir quels sous-paquets il recherche. Dans mon cas, il voulait les bibliothèques MPI et les graphes.

 # Compute component-specific hints.
  set(_Boost_FIND_LIBRARY_HINTS_FOR_COMPONENT "")
  if(${COMPONENT} STREQUAL "mpi" OR ${COMPONENT} STREQUAL "mpi_python" OR
     ${COMPONENT} STREQUAL "graph_parallel")
    foreach(lib ${MPI_CXX_LIBRARIES} ${MPI_C_LIBRARIES})
      if(IS_ABSOLUTE "${lib}")
        get_filename_component(libdir "${lib}" PATH)
        string(REPLACE "\\" "/" libdir "${libdir}")
        list(APPEND _Boost_FIND_LIBRARY_HINTS_FOR_COMPONENT ${libdir})
      endif()
    endforeach()
  endif()

apt-cache search ... J'ai installé les paquets dev depuis que je construisais du code, et le paquet dev traîne dans toutes les dépendances. Je ne suis pas sûr qu'une installation Boost standard nécessite Open MPI, mais c'est OK pour le moment.

Sudo apt-get install libboost-mpi-dev libboost-mpi-python-dev
Sudo apt-get install libboost-graph-parallel-dev
0
rickfoosusa

J'ai rencontré un problème similaire sur un serveur Linux, où deux versions de Boost ont été installées. L'un est la version 1.53.0 précompilée qui compte comme étant ancienne en 2018; c'est dans /usr/include et /usr/lib64. La version que je souhaite utiliser est la version 1.67.0; une version minimale de la version 1.65.1 est requise pour une autre bibliothèque C++ que je suis en train d'installer. c'est dans /opt/boost, qui a les sous-répertoires include et lib. Comme suggéré dans les réponses précédentes, j'ai défini les variables dans CMakeLists.txt pour spécifier où chercher Boost 1.67.0 comme suit

include_directories(/opt/boost/include/)
include_directories(/opt/boost/lib/)
set(BOOST_ROOT /opt/boost/)
set(BOOST_INCLUDEDIR /opt/boost/include/)
set(BOOST_LIBRARYDIR /opt/boost/lib)
set(Boost_NO_SYSTEM_PATHS TRUE)
set(Boost_NO_BOOST_CMAKE TRUE)

Mais CMake n'honore pas ces changements. Ensuite, j'ai trouvé un article en ligne: CMake peut utiliser un Boost local et me suis rendu compte que je devais modifier les variables dans CMakeCache.txt. Là, j'ai trouvé que les variables liées à Boost pointaient toujours sur la valeur par défaut Boost 1.53.0, il n'y avait donc rien d'étonnant à ce que CMake n'honore pas mes modifications dans CMakeLists.txt. Ensuite, je règle les variables liées à Boost dans CMakeCache.txt

Boost_DIR:PATH=Boost_DIR-NOTFOUND
Boost_INCLUDE_DIR:PATH=/opt/boost/include/
Boost_LIBRARY_DIR_DEBUG:PATH=/opt/boost/lib
Boost_LIBRARY_DIR_RELEASE:PATH=/opt/boost/lib

J'ai également changé les variables pointant vers le non-en-tête, les parties compilées de la bibliothèque Boost pour pointer vers la version que je veux. Ensuite, CMake a construit avec succès la bibliothèque qui dépend d’une version récente de Boost.

0
Lambda Moses