Comment demander à CMake de lier un exécutable à une bibliothèque partagée externe qui n'est pas construite dans le même projet CMake?
Faire juste target_link_libraries(GLBall ${CMAKE_BINARY_DIR}/res/mylib.so)
donne l'erreur
make[2]: *** No rule to make target `res/mylib.so', needed by `GLBall'. Stop.
make[1]: *** [CMakeFiles/GLBall.dir/all] Error 2
make: *** [all] Error 2
(GLBall is the executable)
après avoir copié la bibliothèque dans le répertoire binaire bin/res
.
J'ai essayé d'utiliser find_library(RESULT mylib.so PATHS ${CMAKE_BINARY_DIR}/res)
Ce qui échoue avec RESULT-NOTFOUND
.
link_directories
est déconseillée, même dans sa propre documentation. Je pense qu'il serait préférable ici de résoudre l'find_library
appel échoué dans la question d'origine, ou d'utiliser la solution de @ Andre.find_library
et utiliser ce chemin au lieu de le coder en dur, cf. ma réponse .La réponse de arrowdodger est correcte et préférée à plusieurs reprises. Je voudrais simplement ajouter une alternative à sa réponse:
Vous pouvez ajouter une cible de bibliothèque "importée" au lieu d'un répertoire de liens. Quelque chose comme:
Et puis liez comme si cette bibliothèque avait été construite par votre projet:
Une telle approche vous donnerait un peu plus de flexibilité: jetez un œil à la commande add_library () et aux nombreuses propriétés cibles liées aux bibliothèques importées .
Je ne sais pas si cela résoudra votre problème avec les "versions mises à jour des bibliothèques".
la source
add_library( mylib SHARED IMPORTED )
ou vous obtenez uneadd_library called with IMPORTED argument but no library type
erreurIMPORTED_LOCATION
le bracketing d' ouverture, c'est fauxGLOBAL
aprèsIMPORTED
si vous voulez accéder à la bibliothèque importée dans les répertoires au-dessus du courant:add_library(breakpad STATIC IMPORTED GLOBAL)
Je suppose que vous souhaitez créer un lien vers une bibliothèque appelée foo , son nom de fichier est généralement quelque chose de lien
foo.dll
oulibfoo.so
.1. Trouvez la bibliothèque
Vous devez trouver la bibliothèque. C'est une bonne idée, même si vous connaissez le chemin d'accès à votre bibliothèque. CMake affichera une erreur si la bibliothèque a disparu ou a obtenu un nouveau nom. Cela permet de détecter rapidement l'erreur et de faire comprendre à l'utilisateur (peut-être vous-même) ce qui cause un problème.
Pour trouver une bibliothèque foo et stocker le chemin
FOO_LIB
utiliséCMake déterminera lui-même comment le nom réel du fichier est. Il vérifie les endroits habituels comme
/usr/lib
,/usr/lib64
et les chemins d'accèsPATH
.Vous connaissez déjà l'emplacement de votre bibliothèque. Ajoutez-le à
CMAKE_PREFIX_PATH
lorsque vous appelez CMake, puis CMake recherchera également votre bibliothèque dans les chemins passés.Parfois, vous devez ajouter des astuces ou des suffixes de chemin, consultez la documentation pour plus de détails: https://cmake.org/cmake/help/latest/command/find_library.html
2. Liez la bibliothèque À partir de 1. vous avez le nom complet de la bibliothèque
FOO_LIB
. Vous l'utilisez pour lier la bibliothèque à votre cibleGLBall
comme dansVous devez ajouter
PRIVATE
,PUBLIC
ouINTERFACE
après la cible, cf. la documentation: https://cmake.org/cmake/help/latest/command/target_link_libraries.htmlSi vous n'ajoutez pas l'un de ces spécificateurs de visibilité, il se comportera comme
PRIVATE
ouPUBLIC
, selon la version de CMake et les stratégies définies.3. Ajouter des inclusions (Cette étape n'est peut-être pas obligatoire.)
Si vous souhaitez également inclure des fichiers d'en-tête, utilisez
find_path
similaire àfind_library
et recherchez un fichier d'en-tête. Ajoutez ensuite le répertoire d'inclusion avec untarget_include_directories
fichier similaire àtarget_link_libraries
.Documentation: https://cmake.org/cmake/help/latest/command/find_path.html et https://cmake.org/cmake/help/latest/command/target_include_directories.html
Si disponible pour le logiciel externe, vous pouvez remplacer
find_library
etfind_path
parfind_package
.la source
find_package
est tellement plus simple que de suivre ces étapestarget_link_libraries(mylib "${FOO_LIB}")
? La cible est aumylib
lieu de sa cible réelle,GLBall
? Cela n'a pas beaucoup de sens pour moiUne autre alternative, dans le cas où vous travaillez avec l'Appstore, vous avez besoin de "droits" et en tant que tel vous devez vous connecter avec un Apple-Framework.
Pour que les droits fonctionnent (par exemple GameCenter), vous devez avoir une étape de construction "Lier le binaire avec les bibliothèques", puis créer un lien avec "GameKit.framework". CMake "injecte" les bibliothèques à un "bas niveau" dans la ligne de commande, donc Xcode ne le sait pas vraiment , et en tant que tel, vous ne le serez pas GameKit activé dans l'écran Capabilities.
Une façon d'utiliser CMake et d'avoir une étape de construction "Lien avec les binaires" est de générer le xcodeproj avec CMake, puis d'utiliser 'sed' pour 'rechercher et remplacer' et ajouter le GameKit comme XCode l'aime ...
Le script ressemble à ceci (pour Xcode 6.3.1).
enregistrez ceci dans "gamecenter.sed" puis "appliquez-le" comme ceci (cela change votre xcodeproj!)
Vous devrez peut-être modifier les commandes de script pour répondre à vos besoins.
Attention: il est susceptible de rompre avec une version Xcode différente car le format du projet pourrait changer, le numéro unique (codé en dur) peut ne pas vraiment être unique - et généralement les solutions d'autres personnes sont meilleures - donc à moins que vous n'ayez besoin de soutenir l'Appstore + Droits (et builds automatisés), ne faites pas cela.
Il s'agit d'un bogue CMake, voir http://cmake.org/Bug/view.php?id=14185 et http://gitlab.kitware.com/cmake/cmake/issues/14185
la source