De toute évidence, vous devez placer les bibliothèques que vous voulez là où je les place *boost libraries here*. Par exemple, si vous utilisez la bibliothèque filesystemand regex, vous écrirez:
Notez que vous n'avez pas besoin de spécifier des composants pour les bibliothèques d'en-tête uniquement, telles que lexical_cast. Ainsi, vous n'avez besoin que de la commande find_packageet include_directories.
miguel.martin
1
Sous Windows, cela peut également aider à ajouter ceci à votre fichier cmake: ADD_DEFINITIONS (-DBOOST_ALL_NO_LIB) sinon vous risquez de rencontrer stackoverflow.com/questions/28887680/…
Stéphane
est-il possible de régler BOOST_USE_STATIC_LIBS sur ON et Boost_USE_STATIC_RUNTIME OFF? & vice versa.
calmar
5
Que veut *boost libraries here*dire?
IgorGanapolsky
2
Vous pouvez également utiliser FIND_PACKAGE(Boost REQUIRED COMPONENTS system)si vous ne connaissez pas la version exacte de boost à utiliser
smac89
78
Vous pouvez utiliser find_package pour rechercher les bibliothèques boost disponibles. Il reporte la recherche de Boost à FindBoost.cmake , qui est installé par défaut avec CMake.
Lors de la recherche de Boost, l' find_package()appel aura rempli de nombreuses variables (vérifiez la référence pour FindBoost.cmake ). Parmi ceux-ci BOOST_INCLUDE_DIRS, citons les variabels Boost_LIBRARIES et Boost_XXX_LIBRARY, avec XXX remplacés par des bibliothèques Boost spécifiques. Vous pouvez les utiliser pour spécifier include_directories et target_link_libraries .
Par exemple, supposons que vous ayez besoin de boost :: program_options et boost :: regex, vous feriez quelque chose comme:
find_package(Boost REQUIRED COMPONENTS program_options regex )
include_directories( ${Boost_INCLUDE_DIRS})
add_executable( run main.cpp )# Example application based on main.cpp# Alternatively you could use ${Boost_LIBRARIES} here.
target_link_libraries( run ${Boost_PROGRAM_OPTIONS_LIBRARY} ${Boost_REGEX_LIBRARY})
Quelques conseils généraux:
Lors de la recherche, FindBoost vérifie la variable d'environnement $ ENV {BOOST_ROOT}. Vous pouvez définir cette variable avant d'appeler find_package si nécessaire.
Lorsque vous avez plusieurs versions de build de boost (multi-thread, statique, partagée, etc.), vous pouvez spécifier la configuration souhaitée avant d'appeler find_package. Pour ce faire, définissez certaines des variables suivantes sur On:Boost_USE_STATIC_LIBS , Boost_USE_MULTITHREADED,Boost_USE_STATIC_RUNTIME
Lorsque vous recherchez Boost sur Windows, faites attention à la liaison automatique. Lisez la «REMARQUE pour les utilisateurs de Visual Studio» dans le référence .
Mon conseil est de désactiver la liaison automatique et d'utiliser la gestion des dépendances de cmake: add_definitions( -DBOOST_ALL_NO_LIB )
Dans certains cas, vous devrez peut-être spécifier explicitement qu'un Boost dynamique est utilisé: add_definitions( -DBOOST_ALL_DYN_LINK )
Notez qu'il n'est plus nécessaire de spécifier manuellement les répertoires d'inclusion, car cela est déjà pris en charge via les cibles importées Boost::filesystemet Boost::regex. regexet filesystempeut être remplacé par toutes les bibliothèques boost dont vous avez besoin.
À quoi cela ressemblerait-il si vous vouliez dire de lier à tous les boost? Je veux dire sans énumérer toutes les bibliothèques, il y a en boost.
Toby Brull
4
Si vous n'utilisez que des parties d'en-tête de boost, 'Boost :: boost' sera suffisant. Toutes les bibliothèques boost compilées doivent être spécifiées explicitement.
oLen
2
@oLen Où puis-je trouver une liste de toutes les cibles cmake Boost :: * importées? Comment savoir vers lequel je dois me connecter?
Markus
8
Que cela puisse être utile pour certaines personnes. J'ai eu une erreur vilaine:
référence non définie au symbole '_ZN5boost6system15system_categoryEv' //usr/lib/x86_64-linux-gnu/libboost_system.so.1.58.0: erreur d'ajout de symboles: DSO manquant dans la ligne de commande
Il y avait un problème de cmakeList.txt et d'une manière ou d'une autre, il me manquait d'inclure explicitement les bibliothèques «système» et «système de fichiers». Donc, j'ai écrit ces lignes dans CMakeLists.txt
Ces lignes sont écrites au début avant de créer l'exécutable du projet, car à ce stade, nous n'avons pas besoin de lier la bibliothèque boost à l'exécutable de notre projet.
Je suis d'accord avec les réponses 1 et 2 . Cependant, je préfère spécifier chaque bibliothèque séparément. Cela rend les dépendances plus claires dans les grands projets. Pourtant, il y a le risque de mal saisir les noms de variables (sensibles à la casse). Dans ce cas, il n'y a pas d'erreur cmake directe, mais certains problèmes liés à l'éditeur de liens de références non définies plus tard, ce qui peut prendre un certain temps à résoudre. Par conséquent, j'utilise la fonction cmake suivante:
function(VerifyVarDefined)
foreach(lib ${ARGV})if(DEFINED ${lib})else(DEFINED ${lib})
message(SEND_ERROR "Variable ${lib} is not defined")
endif(DEFINED ${lib})
endforeach()
endfunction(VerifyVarDefined)
Pour l'exemple mentionné ci-dessus, cela ressemble à:
VerifyVarDefined(Boost_PROGRAM_OPTIONS_LIBRARYBoost_REGEX_LIBRARY)
target_link_libraries( run ${Boost_PROGRAM_OPTIONS_LIBRARY} ${Boost_REGEX_LIBRARY})
Si j'avais écrit "BOOST_PROGRAM_OPTIONS_LIBRARY", il y aurait eu une erreur déclenchée par cmake et pas beaucoup plus tard déclenchée par l'éditeur de liens.
Réponses:
Mettez ceci dans votre
CMakeLists.txt
fichier (changez les options de OFF à ON si vous le souhaitez):De toute évidence, vous devez placer les bibliothèques que vous voulez là où je les place
*boost libraries here*
. Par exemple, si vous utilisez la bibliothèquefilesystem
andregex
, vous écrirez:la source
lexical_cast
. Ainsi, vous n'avez besoin que de la commandefind_package
etinclude_directories
.*boost libraries here*
dire?FIND_PACKAGE(Boost REQUIRED COMPONENTS system)
si vous ne connaissez pas la version exacte de boost à utiliserVous pouvez utiliser find_package pour rechercher les bibliothèques boost disponibles. Il reporte la recherche de Boost à FindBoost.cmake , qui est installé par défaut avec CMake.
Lors de la recherche de Boost, l'
find_package()
appel aura rempli de nombreuses variables (vérifiez la référence pour FindBoost.cmake ). Parmi ceux-ciBOOST_INCLUDE_DIRS
, citons les variabels Boost_LIBRARIES et Boost_XXX_LIBRARY, avec XXX remplacés par des bibliothèques Boost spécifiques. Vous pouvez les utiliser pour spécifier include_directories et target_link_libraries .Par exemple, supposons que vous ayez besoin de boost :: program_options et boost :: regex, vous feriez quelque chose comme:
Quelques conseils généraux:
On
:Boost_USE_STATIC_LIBS
,Boost_USE_MULTITHREADED
,Boost_USE_STATIC_RUNTIME
add_definitions( -DBOOST_ALL_NO_LIB )
add_definitions( -DBOOST_ALL_DYN_LINK )
la source
En adaptant la réponse de @ LainIwakura pour la syntaxe CMake moderne avec des cibles importées, ce serait:
Notez qu'il n'est plus nécessaire de spécifier manuellement les répertoires d'inclusion, car cela est déjà pris en charge via les cibles importées
Boost::filesystem
etBoost::regex
.regex
etfilesystem
peut être remplacé par toutes les bibliothèques boost dont vous avez besoin.la source
Que cela puisse être utile pour certaines personnes. J'ai eu une erreur vilaine: référence non définie au symbole '_ZN5boost6system15system_categoryEv' //usr/lib/x86_64-linux-gnu/libboost_system.so.1.58.0: erreur d'ajout de symboles: DSO manquant dans la ligne de commande Il y avait un problème de cmakeList.txt et d'une manière ou d'une autre, il me manquait d'inclure explicitement les bibliothèques «système» et «système de fichiers». Donc, j'ai écrit ces lignes dans CMakeLists.txt
Ces lignes sont écrites au début avant de créer l'exécutable du projet, car à ce stade, nous n'avons pas besoin de lier la bibliothèque boost à l'exécutable de notre projet.
Maintenant, à la fin du fichier, j'ai écrit ces lignes en considérant "KeyPointEvaluation" comme exécutable de mon projet.
la source
Je suis d'accord avec les réponses 1 et 2 . Cependant, je préfère spécifier chaque bibliothèque séparément. Cela rend les dépendances plus claires dans les grands projets. Pourtant, il y a le risque de mal saisir les noms de variables (sensibles à la casse). Dans ce cas, il n'y a pas d'erreur cmake directe, mais certains problèmes liés à l'éditeur de liens de références non définies plus tard, ce qui peut prendre un certain temps à résoudre. Par conséquent, j'utilise la fonction cmake suivante:
Pour l'exemple mentionné ci-dessus, cela ressemble à:
Si j'avais écrit "BOOST_PROGRAM_OPTIONS_LIBRARY", il y aurait eu une erreur déclenchée par cmake et pas beaucoup plus tard déclenchée par l'éditeur de liens.
la source
Essayez de dire la documentation Boost :
N'oubliez pas de remplacer foo par le nom de votre projet et les composants par le vôtre!
la source