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'obtiens toujours une erreur indiquant que CMake ne peut pas trouver Boost. Quelle pourrait être la raison d'une telle erreur?
87
Boost_INCLUDE_DIR
et d'autres utilisent l'indicateurBoost_INCLUDEDIR
( sans le trait de soulignement ). Vous pouvez vérifier le bon pour votre cas en lisant leFindBoost.cmake
fichier, souspath-to-cmake/Modules/FindBoost.cmake
find_package(Boost CONFIG)
Réponses:
Êtes-vous sûr de le faire de la bonne façon? L'idée est que CMake définit
BOOST_INCLUDE_DIR
,BOOST_LIBRARYDIR
etBOOST_ROOT
automatiquement. Faites quelque chose comme ça dansCMakeLists.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éeCMakeLists.txt
.la source
${Boost_INCLUDE_DIR}
pas le${BOOST_INCLUDE_DIR}
cas, l'affaire compte.BOOST_INCLUDEDIR
'?Il y a plus d'aide disponible en lisant le
FindBoost.cmake
fichier 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_ROOT
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 en savoir plus à ce sujet en lisantFindBoost.cmake
.Enfin,
FindBoost.cmake
a eu quelques bugs dans le passé. Une chose que vous pourriez essayer est de prendre une version plus récente deFindBoost.cmake
la 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.
la source
J'ai moi-même lutté contre ce problème pendant un certain temps. Il s'est avéré que
cmake
recherchait 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 utilisantGCC 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, leFindBoost.cmake
script de cmake détectait automatiquement l'GCC 4.4.7
installation au lieu de celle-GCC 4.9.1
ci, 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_COMPILER
sur "-gcc49
" dansCMakeLists.txt
. Avec ce changement,FindBoost.cmake
j'ai cherché et trouvé mes fichiers de bibliothèque Boost.la source
Vous pouvez également spécifier la version de Boost que vous souhaitez que CMake utilise en passant
-DBOOST_INCLUDEDIR
ou en-DBOOST_ROOT
pointant vers l'emplacement des en-têtes de boost de version correctsExemple:
cmake -DBOOST_ROOT=/opt/latestboost
Cela sera également utile lorsque plusieurs versions de boost sont sur le même système.
la source
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!
la source
J'ai eu le même problème en essayant de courir
make
pour 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-
cmake
même les options et j'ai trouvé ce qui suit: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.
la source
Pour la version cmake
3.1.0-rc2
à ramasser,boost 1.57
spécifiez-D_boost_TEST_VERSIONS=1.57
cmake version 3.1.0-rc2
par défautboost<=1.56.0
comme 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++
la source
Si vous créez votre propre boost, n'oubliez pas d'utiliser le
--layout=versioned
sinon la recherche d'une version particulière de la bibliothèque échouerala source
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 quiBoost_DEBUG
affiche sa valeur. La chose à faire ici est de cocher la case "Avancé" et de l'activerCGAL_Boost_USE_STATIC_LIBS
.la source
J'ai eu le même problème et aucune des solutions ci-dessus n'a fonctionné. En fait, le fichier
include/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
la source
Cela peut également se produire si
CMAKE_FIND_ROOT_PATH
est défini comme différent deBOOST_ROOT
. J'ai rencontré le même problème que malgré le réglageBOOST_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_PATH
semble être laBOOST_ROOT
cause du problème.la source
Peut être
va vous aider.
la source