web-dev-qa-db-fra.com

Cmake ne trouve pas Boost

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_LIBRARYDIR et BOOST_ROOT, mais j'ai toujours une erreur qui dit que CMake n'est pas capable de trouver Boost. Quelle pourrait être la raison d'une telle erreur?

66
Ivan Gromov

Êtes-vous sûr de le faire correctement? L'idée est que CMake définit automatiquement BOOST_INCLUDE_DIR, BOOST_LIBRARYDIR et BOOST_ROOT. Faites quelque chose comme ceci 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 le FIND_PACKAGE (Boost) dans CMakeLists.txt

87
fschmitt

Vous trouverez plus d’aide en lisant le fichier FindBoost.cmake lui-même. Il se trouve dans votre répertoire "Modules". 

Un bon début est de définir (Boost_DEBUG 1) - cela vous donnera une bonne quantité d’informations sur ce que recherche boost, ce qu’il recherche, et peut aider à expliquer pourquoi il ne le trouve pas. 

Cela peut également vous aider à déterminer s’il capte correctement votre BOOST_ROOT. 

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

Enfin, FindBoost.cmake a eu quelques bugs dans le passé. Une chose à faire est d’utiliser une version plus récente de FindBoost.cmake de la dernière version de cmake et de la coller dans votre dossier de projet, à côté de CMakeLists.txt. Même si vous possédez une ancienne version de boost, il utilisera la nouvelle version de FindBoost.cmake qui se trouve dans le dossier de votre projet. 

Bonne chance. 

39
don bright

Je me suis battu avec ce problème pendant un moment moi-même. Il s'est avéré que cmake recherchait des fichiers de bibliothèque Boost en utilisant la convention de nommage de Boost, dans laquelle le nom de la bibliothèque est une fonction de la version du compilateur utilisé pour le 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.7 s'est également avéré être installé. En l'occurrence, le script FindBoost.cmake de cmake détectait automatiquement l'installation de GCC 4.4.7 au lieu de celui de GCC 4.9.1 et recherchait donc des fichiers de bibliothèque Boost avec "gcc44" dans les noms de fichiers plutôt que "gcc49".

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

8
Tom P.

J'ai également eu un problème similaire et j'ai découvert que les variables env BOOST_INCLUDE_DIR, BOOST_LIBRARYDIR et BOOST_ROOT devaient contenir absolute chemins . HTH!

3
sphakka

Vous pouvez également spécifier la version de Boost que vous souhaitez que CMake utilise en passant -DBOOST_INCLUDEDIR ou -DBOOST_ROOT en indiquant l'emplacement des bons en-têtes de version

Exemple:

cmake -DBOOST_ROOT=/opt/latestboost

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

3
Skillachie

Si vous construisez votre propre boost n'oubliez pas d'utiliser le --layout = versioned sinon la recherche d'une version particulière de la bibliothèque échouera

2
Gaetano Mendola

Pour que cmake version 3.1.0-rc2 accepte l’augmentation 1.57, spécifiez -D_boost_TEST_VERSIONS = 1.57.

par défaut, cmake version 3.1.0-rc2 augmente <= 1.56.0, comme indiqué à l'aide de -DBoost_DEBUG = ON

cmake -D_boost_TEST_VERSIONS = 1.57 -DBoost_DEBUG = ON -DCMAKE_BUILD_TYPE = Déboguer -DCMAKE_C_COMPILER = clang -DCMAKE_CXX_COMPILER = clang ++

1
Simon Allfrey

J'ai eu le même problème en essayant d'exécuter make pour un projet après l'installation de Boost version 1.66.0 sur Ubuntu Trusty64. Le message d'erreur était semblable à celui-ci (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 n’a pas pu le détecter. Après avoir passé beaucoup de temps à bricoler des chemins et des variables d'environnement, j'ai fini par vérifier cmake pour lui-même les options et constaté que:

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

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

Sudo cmake --check-system-vars

qui a rendu:

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.

0
user3006381

Encore un conseil pour ceux qui essaient de construire CGAL en particulier, avec Boost lié statiquement. Il ne suffit pas de définir Boost_USE_STATIC_LIBS; il est remplacé par le temps Boost_DEBUG affiche sa valeur. La chose à faire ici est de cocher la case "Avancé" et d'activer CGAL_Boost_USE_STATIC_LIBS.

0
Philip