web-dev-qa-db-fra.com

CMake ne trouve pas les bibliothèques Boost

J'essaie d'utiliser un script CMake pour compiler une application Boost sous Windows. Les bibliothèques avec en-tête seulement fonctionnent correctement, mais CMake n'a pas trouvé les bibliothèques (les bibliothèques suivantes n'ont pas été trouvées: boost_serialization ). La partie pertinente du script CMake est:

# Path where CMake can find additional libraries
SET(CMAKE_PREFIX_PATH Libs)

# Boost
SET(Boost_ADDITIONAL_VERSIONS "1.47" "1.47.0")
SET(Boost_USE_STATIC_LIBS   ON)
find_package(Boost REQUIRED COMPONENTS serialization)

J'ai un dossier appelé "Libs" dans mon projet où des bibliothèques tierces telles que DevIL et Boost sont stockées, donc je le règle en premier. Cela fonctionne très bien pour les fichiers d'en-tête Devil et Boost, donc je suppose que je n'aurais pas besoin de la variable BOOST_ROOT. L'installation de Boost est la distribution source standard de boost.org que j'ai compilée avec BJam . Les bibliothèques sont stockées dans boost_1_47_0\bin.v2\libs et je n’ai rien changé dans le processus de construction.

Je pense que c'est un peu étrange, que le dossier boost_1_47_0\libs ne contienne aucun fichier de bibliothèque, mais des fichiers BJam et d'autres éléments, mais cela ne devrait pas poser de problème, car cela semble être le moyen normal de créer Boost sous Windows à partir du code source. .

J'ai regardé la sortie Debug du fichier FindBoost.cmake (j'utilise le script par défaut de CMake 2.8) et il ne semble pas se pencher sur bin.v2. Au lieu de cela, il recherche boost_ROOT/lib, mais quand j'ai copié le contenu de bin.v2\libs dans lib, il n'a toujours rien trouvé.

Alors, quel est un moyen élégant de trouver Boost qui fonctionnera également sur d’autres plates-formes avec des distributions Boost communes?

17
JonathanK

Eh bien, j'ai résolu le problème, mais je ne suis pas entièrement satisfait de ma solution.

À mon avis, le problème était que BJam crée une structure de dossiers trop complexe. Maintenant, je viens de copier les fichiers de bibliothèque de "boost_1_47_0\bin.v2\libs\serialization\build\msvc-9.0\debug\link-static\threading-multi" dans "boost_1_47_0\lib".

Je dois le faire à la main, mais je n'utilise pas beaucoup de bibliothèques Boost, cette étape est donc OK, à mon avis. Je vais documenter ma solution à part le script CMake, afin que les autres utilisateurs puissent s'entendre avec cela.

6
JonathanK

Je voudrais essayer de définir BOOST_ROOT dans votre fichier CMakeLists.txt. Je sais que CMake 2.8.6 trouvera Boost 1.47.0 lorsque vous définissez la variable Boost_ADDITIONAL_VERSIONS, car cela fonctionne pour moi sous Windows lorsque BOOST_ROOT est défini.

Voici ce que j'ai dans un projet:

 
 définir (sérialisation BOOST_COMPONENTS_NEEDED) 
 
 # Les vérifications suivantes indiquent que BOOST_ROOT est correctement défini. 
 si (NOT BOOST_ROOT AND NOT $ ENV {BOOST_ROOT } STREQUAL "") 
 FILE (TO_CMAKE_PATH $ ENV {BOOST_ROOT} BOOST_ROOT) 
 If (NOT EXISTS $ {BOOST_ROOT}) 
 MESSAGE (STATUS $ {BOOST_ROOT} "n'est pas existant. .Vérifier si BOOST_ROOT était une chaîne entre guillemets .. ") 
 STRING (REMPLACE"\"" "" BOOST_ROOT $ {BOOST_ROOT}) 
 If (EXISTS $ {BOOST_ROOT}) 
 MESSAGE (STATUS "Après avoir supprimé les guillemets," $ {BOOST_ROOT} "a maintenant été trouvé par CMake") 
 Endif (EXISTS $ {BOOST_ROOT}) 
 Endif (NOT EXISTS $ {BOOST_ROOT}) 
 
 # Enregistrez le fichier BOOST_ROOT dans le cache 
 Si (NOT EXISTS $ {BOOST_ROOT}) 
 MESSAGE (AVERTISSEMENT $ {BOOST_ROOT} "n'existe pas."). ____.] else (NOT EXISTS $ {BOOST_ROOT}) 
 SET (BOOST_ROOT $ {BOOST_ROOT} CACHE STRING "Définissez la valeur de BOOST_ROOT sur le dossier racine de votre installation boost." FORCE) 
 #SET (BOOST_INCLUDEDIR $ {BOOST_ROOT}/Include) 
 #. SET (BOOST_LIBRARYDIR $ {BOOST_ROOT}/lib) 
 Endif (NOT EXISTS $ {BOOST_ROOT}) 
 Endif (NOT BOOST_ROOT ET PAS $ ENV {BOOST_ROOT} STREQUAL "" 
 
 if (WIN32 AND NOT BOOST_ROOT) 
 MESSAGE (AVERTISSEMENT "Définissez la variable d'environnement BOOST_ROOT.") 
 endif (WIN32 AND NOT BOOST_ROOT) 
 
 définir (Boost_ADDITIONAL_VERSIONS "1.47" "1.47.0") 
 définir (Boost_DEBUG ON) 
 définir (Boost_USE_STATIC_LIBS OFF) 
 défini (Boost_USE_MULTITHREADED ON) 
 set (Boost_USE_STATIC_RUNTIME OFF) 
 FIND_PACKAGE (Boost 1.47.0 COMPONENTS $ {BOOST_COMPONENTS_NEEDED}) 
 if (Boost_FOUND) 
 MESSAGE (STATUS "Réglage de la stimulation.") [. .____.] include_directories ($ {Boost_I NCLUDE_DIRS}) 
 If (Boost_DEBUG) 
 MESSAGE (STATUS "BOOST Libraries" $ {Boost_LIBRARIES}) 
 FOREACH (BOOST_COMPONENT $ {BOOST_COMPONENTS_NEEDED}) 
 STRING (TOUPPER) $ {BOOST_COMPONENT} BOOST_COMPONENT_UPCASE) 
 MESSAGE (STATUS "Boost" $ {BOOST_COMPONENT} ":" $ {Boost _ $ {BOOST_COMPONENT_UPCASE} _LIBRARY}) 
 MESSAGE (STATUS "Boost" $ Débogage: "$ {Boost _ $ {BOOST_COMPONENT_UPCASE} _LIBRARY_DEBUG}) 
 MESSAGE (STATUS" Boost "$ {BOOST_COMPONENT}": "{{}}} ) 
 endif (Boost_DEBUG) 
 endif (Boost_FOUND) 
 
14
drescherjm

Je suis venu ici avec un problème similaire et je voulais juste dire que mon correctif était similaire, mais pas exactement le même.

Mon préfixe d'installation était C:\lib\boost\boost_1_57_0. J'ai défini une variable d'environnement BOOST_ROOT pointant vers ce répertoire, mais CMake (3.1.0) n'a toujours pas trouvé les en-têtes. J'ai réalisé que les en-têtes installés par défaut pour installer C:\lib\boost\boost_1_57_0\include\boost-1_57\boost. Je ne vais pas exécuter plusieurs versions, je viens donc de déplacer le dernier répertoire Boost vers le bas, de supprimer le répertoire boost-1_57 et de terminer avec les en-têtes ici:

C:\lib\boost\boost_1_57_0\include\boost

Et CMake a tout trouvé.

0
Chuck Claunch

J'ai déjà eu un problème avec ça. Pour une raison quelconque, b2 (aka BJam) a créé les bibliothèques Boost avec un "lib" principal.

Le script CMake ne cherchera pas de fichier nommé libboost_thread.lib. Il ne trouvera que boost_thread.lib. Supprimez la lib principale et CMake devrait les trouver.

0
deft_code