2010-09-28 9 views
58

J'essaie de configurer un projet en utilisant CMake, mais il ne parvient pas à trouver les bibliothèques Boost même si elles sont dans le dossier spécifié. J'ai spécifié Boost_INCLUDE_DIR, Boost_LIBRARYDIR et BOOST_ROOT, mais j'obtiens toujours une erreur indiquant que CMake n'est pas capable de trouver Boost. Quelle pourrait être la raison d'une telle erreur?Cmake ne trouve pas Boost

Répondre

81

Êtes-vous sûr de le faire correctement? L'idée est que CMake définit BOOST_INCLUDE_DIR, BOOST_LIBRARYDIR et BOOST_ROOT automatiquement. 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 dire CMake où chercher élan 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

+26

Il est '$ {} Boost_INCLUDE_DIR' 'pas $ {}' BOOST_INCLUDE_DIR, les questions de cas. –

+2

Peut-être que cela a changé dans les versions les plus récentes de CMake, mais voici la documentation de référence: http://www.cmake.org/cmake/help/v3.0/module/FindBoost.html –

+2

il me ne marche pas pour le travail ... Il trouve la bibliothèque boost, mais générer des tonnes d'erreurs à la compilation –

37

Il y a plus d'aide disponible en lisant le fichier lui-même FindBoost.cmake. Il est situé dans votre répertoire 'Modules'. Un bon début est de définir (Boost_DEBUG 1) - cela va générer beaucoup d'informations sur l'endroit où boost cherche, ce qu'il cherche, et peut aider à expliquer pourquoi il ne peut pas le trouver.

Cela peut aussi vous aider à déterminer si votre BOOST_ROOT se déclenche correctement.

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

Enfin, FindBoost.cmake a eu quelques bugs dans le passé. Une chose que vous pouvez essayer est de prendre une nouvelle version de FindBoost.cmake de la dernière version de cmake, et le coller dans votre dossier de projet aux côtés de CMakeLists.txt - alors même si vous avez une ancienne version de boost, il utilisera le nouvelle version de FindBoost.cmake qui se trouve dans le dossier de votre projet.

Bonne chance.

0

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

2

Si vous construisez votre propre coup de pouce ne pas oublier d'utiliser la --layout = versionné sinon la recherche d'une version particulière de la bibliothèque échouera

3

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

1

Pour la version CMake 3.1.0-RC2 pour ramasser boost 1,57 spécifier -D_boost_TEST_VERSIONS = 1,57

version par défaut CMake 3.1.0-RC2 pour stimuler < = 1.56.0 comme on le voit à l'aide -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 ++

7

J'ai moi-même lutté avec ce problème pendant un moment. Il est avéré que cmake était à la recherche des fichiers de bibliothèque Boost en utilisant la convention de nommage de Boost, dans lequel 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 que la version du compilateur était en fait présent 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 GCC 4.4.7 au lieu du 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 réglant Boost_COMPILER sur "-gcc49" dans CMakeLists.txt. Avec ce changement, FindBoost.cmake recherché, et trouvé, mes fichiers de bibliothèque Boost.

1

Vous pouvez également spécifier la version de Boost que vous souhaitez CMake à utiliser en passant -DBOOST_INCLUDEDIR ou -DBOOST_ROOT pointant vers l'emplacement des en-têtes de boost version correcte

Exemple:

cmake -DBOOST_ROOT=/opt/latestboost

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

0

J'ai eu le même problème en essayant d'exécuter make pour un projet après avoir installé la version Boost 1.66.0 sur Ubuntu Trusty64. Le message d'erreur est 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 a été définitivement installé, mais CMake ne pouvait pas le détecter. Après avoir passé beaucoup de temps à bricoler avec des chemins et des variables environnementales, j'ai finalement fini par vérifier cmake lui-même pour les options et a trouvé ce qui suit:

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

Je courais le suivant dans le répertoire en cause:

sudo cmake --check-system-vars

qui sont retournés:

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 la question.