Cmake ne trouve pas Boost

87

J'essaie de configurer un projet à l'aide de CMake, mais il ne parvient pas à trouver les bibliothèques Boost même si elles se trouvent dans le dossier spécifié. J'ai spécifié Boost_INCLUDE_DIR, Boost_LIBRARYDIRet BOOST_ROOT, mais j'obtiens toujours une erreur indiquant que CMake ne peut pas trouver Boost. Quelle pourrait être la raison d'une telle erreur?

Ivan Gromov
la source
Certaines versions de Boost utilisent l'indicateur Boost_INCLUDE_DIRet d'autres utilisent l'indicateur Boost_INCLUDEDIR( sans le trait de soulignement ). Vous pouvez vérifier le bon pour votre cas en lisant le FindBoost.cmakefichier, souspath-to-cmake/Modules/FindBoost.cmake
marcelosalloum
Pour info, si vous construisez un boost avec le support CMake, vous devriez utiliserfind_package(Boost CONFIG)
Dmitry Sazonov

Réponses:

105

Êtes-vous sûr de le faire de la bonne façon? L'idée est que CMake définit BOOST_INCLUDE_DIR, BOOST_LIBRARYDIRet BOOST_ROOTautomatiquement. Faites quelque chose comme ça dans CMakeLists.txt:

FIND_PACKAGE(Boost)
IF (Boost_FOUND)
    INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIR})
    ADD_DEFINITIONS( "-DHAS_BOOST" )
ENDIF()

Si boost n'est pas installé dans un emplacement par défaut et ne peut donc pas être trouvé par CMake, vous pouvez indiquer à CMake où chercher boost comme ceci:

SET(CMAKE_INCLUDE_PATH ${CMAKE_INCLUDE_PATH} "C:/win32libs/boost")
SET(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} "C:/win32libs/boost/lib")

Bien sûr, ces deux lignes doivent être avant l' FIND_PACKAGE(Boost)entrée CMakeLists.txt.

fschmitt
la source
36
Ce n'est ${Boost_INCLUDE_DIR}pas le ${BOOST_INCLUDE_DIR}cas, l'affaire compte.
Ihor Kaharlichenko
3
Peut-être que cela a changé dans les versions plus récentes de cmake, mais voici la documentation de référence: cmake.org/cmake/help/v3.0/module/FindBoost.html
Nick Desaulniers
2
cela ne fonctionne pas pour moi ... Il trouve la bibliothèque boost, mais génère des tonnes d'erreurs au moment de la compilation
1
Cela ne devrait-il pas être ' BOOST_INCLUDEDIR'?
dmedine le
2
@IhorKaharlichenko, mais BOOST_ROOT doit être BOOST_ROOT. magnifique ! Laissez-moi essayer avec tous les cas, cas de chameau, tout en majuscules, avec traits de soulignement, sans traits de soulignement ... <face-palm>
Duck Dodgers
53

Il y a plus d'aide disponible en lisant le FindBoost.cmakefichier lui-même. Il se trouve dans votre répertoire 'Modules'.

Un bon début est de set(Boost_DEBUG 1)- cela crachera beaucoup d'informations sur l'endroit où le boost recherche, ce qu'il recherche, et peut aider à expliquer pourquoi il ne le trouve pas.

Cela peut également vous aider à déterminer s'il vous détecte BOOST_ROOTcorrectement.

FindBoost.cmakea également parfois des problèmes si la version exacte de boost n'est pas répertoriée dans les variables Versions disponibles. Vous pouvez en savoir plus à ce sujet en lisant FindBoost.cmake.

Enfin, FindBoost.cmakea eu quelques bugs dans le passé. Une chose que vous pourriez essayer est de prendre une version plus récente de FindBoost.cmakela dernière version de CMake et de la coller dans le dossier de votre projet à côté CMakeLists.txt- même si vous avez une ancienne version de boost, elle utilisera la nouvelle version deFindBoost.cmake celle-ci le dossier de votre projet.

Bonne chance.

don brillant
la source
10

J'ai moi-même lutté contre ce problème pendant un certain temps. Il s'est avéré que cmakerecherchait des fichiers de bibliothèque Boost en utilisant la convention de dénomination de Boost, dans laquelle le nom de la bibliothèque est une fonction de la version du compilateur utilisée pour la construire. Nos bibliothèques Boost ont été construites en utilisant GCC 4.9.1, et cette version du compilateur était en fait présente sur notre système; cependant, GCC 4.4.7s'est également avéré être installé. En l'occurrence, le FindBoost.cmakescript de cmake détectait automatiquement l' GCC 4.4.7installation au lieu de celle- GCC 4.9.1ci, et recherchait donc les fichiers de bibliothèque Boost avec " gcc44" dans les noms de fichiers, plutôt que " gcc49".

La solution simple était de forcer cmake à supposer que GCC 4.9 était présent, en définissant Boost_COMPILERsur " -gcc49" dans CMakeLists.txt. Avec ce changement, FindBoost.cmakej'ai cherché et trouvé mes fichiers de bibliothèque Boost.

Tom P.
la source
7

Vous pouvez également spécifier la version de Boost que vous souhaitez que CMake utilise en passant -DBOOST_INCLUDEDIRou en -DBOOST_ROOTpointant vers l'emplacement des en-têtes de boost de version corrects

Exemple:

cmake -DBOOST_ROOT=/opt/latestboost

Cela sera également utile lorsque plusieurs versions de boost sont sur le même système.

Skillachie
la source
Merci, cela a fonctionné pour moi avec Avro build pour Windows.
ggurov
A travaillé pour moi, en le définissant dans l'outil GUI CMake comme environnement ... Puis ajoutez une entrée, puis BOOST_ROOT, valeur C: \ Program Files \ PCL 1.11.1 \ 3rdParty \ Boost (j'ai installé PCL)
Richard Keene
5

J'ai aussi eu un problème similaire et j'ai découvert que les variables env BOOST_INCLUDE_DIR, BOOST_LIBRARYDIR et BOOST_ROOT doivent contenir des chemins absolus . HTH!

sphakka
la source
Oui. Eu le même problème en raison du chemin relatif dans l'environnement BOOST_ROOT. Un grand merci à vous!
korst1k
2

J'ai eu le même problème en essayant de courir makepour un projet après avoir installé la version 1.66.0 de Boost sur Ubuntu Trusty64. Le message d'erreur était similaire (pas exactement comme) celui-ci:

CMake Error at     
/usr/local/Cellar/cmake/3.3.2/share/cmake/Modules/FindBoost.cmake:1245 (message):
Unable to find the requested Boost libraries.
Boost version: 0.0.0
Boost include path: /usr/include
Detected version of Boost is too old.  Requested version was 1.36 (or newer).
Call Stack (most recent call first):
CMakeLists.txt:10 (FIND_PACKAGE)

Boost était définitivement installé, mais CMake ne pouvait pas le détecter. Après avoir passé beaucoup de temps à bricoler des chemins et des variables environnementales, j'ai fini par vérifier moi- cmakemême les options et j'ai trouvé ce qui suit:

--check-system-vars        = Find problems with variable usage in system files

J'ai donc exécuté ce qui suit dans le répertoire en question:

sudo cmake --check-system-vars

qui a renvoyé:

Also check system files when warning about unused and uninitialized variables.
-- Boost version: 1.66.0
-- Found the following Boost libraries:
--   system
--   filesystem
--   thread
--   date_time
--   chrono
--   regex
--   serialization
--   program_options
-- Found Git: /usr/bin/git
-- Configuring done
-- Generating done
-- Build files have been written to: /home/user/myproject

et résolu le problème.

user3006381
la source
2

Pour la version cmake 3.1.0-rc2à ramasser, boost 1.57spécifiez-D_boost_TEST_VERSIONS=1.57

cmake version 3.1.0-rc2par défaut boost<=1.56.0comme on le voit en utilisant-DBoost_DEBUG=ON

cmake -D_boost_TEST_VERSIONS=1.57 -DBoost_DEBUG=ON -DCMAKE_BUILD_TYPE=Debug -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++

Simon Allfrey
la source
2

Si vous créez votre propre boost, n'oubliez pas d'utiliser le --layout=versionedsinon la recherche d'une version particulière de la bibliothèque échouera

Gaetano Mendola
la source
1

Un conseil de plus pour tous ceux qui essaient de créer CGAL en particulier, avec Boost lié statiquement. Il ne suffit pas de définir Boost_USE_STATIC_LIBS; il est remplacé par le temps qui Boost_DEBUGaffiche sa valeur. La chose à faire ici est de cocher la case "Avancé" et de l'activer CGAL_Boost_USE_STATIC_LIBS.

Philippe
la source
0

J'ai eu le même problème et aucune des solutions ci-dessus n'a fonctionné. En fait, le fichierinclude/boost/version.hpp n'a pas pu être lu (par le script cmake lancé par jenkins).

J'ai dû modifier manuellement l'autorisation de la bibliothèque (boost) (même si jenkins appartient au groupe, mais c'est un autre problème lié à jenkins que je ne pouvais pas comprendre):

chmod o+wx ${BOOST_ROOT} -R # allow reading/execution on the whole library
#chmod g+wx ${BOOST_ROOT} -R # this did not suffice, strangely, but it is another story I guess
PJ127
la source
0

Cela peut également se produire si CMAKE_FIND_ROOT_PATHest défini comme différent de BOOST_ROOT. J'ai rencontré le même problème que malgré le réglage BOOST_ROOT, j'obtenais l'erreur. Mais pour la compilation croisée pour ARM, j'utilisais Toolchain-android.cmake dans lequel j'avais (pour une raison quelconque):

set(BOOST_ROOT "/home/.../boost")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} --sysroot=${SYSROOT}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --sysroot=${SYSROOT} -I${SYSROOT}/include/libcxx")
set(CMAKE_CXX_LINK_FLAGS "${CMAKE_CXX_LINK_FLAGS}")
set(CMAKE_FIND_ROOT_PATH "${SYSROOT}")

CMAKE_FIND_ROOT_PATHsemble être la BOOST_ROOTcause du problème.

Sabin
la source
-1

Peut être

brew install boost

va vous aider.

yayu
la source