CMake lien vers une bibliothèque externe

Comment faire en sorte que CMake lie un exécutable à une bibliothèque partagée externe qui n’est pas créée dans le même projet CMake?

Le fait de target_link_libraries(GLBall ${CMAKE_BINARY_DIR}/res/mylib.so) faire que 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 j’ai copié la bibliothèque dans le répertoire binary bin/res .

J’ai essayé d’utiliser find_library(RESULT mylib.so PATHS ${CMAKE_BINARY_DIR}/res)

Qui échoue avec RESULT-NOTFOUND .

Définissez d’abord le chemin de recherche des bibliothèques:

 LINK_DIRECTORIES(${CMAKE_BINARY_DIR}/res) 

Et puis juste faire

 TARGET_LINK_LIBRARIES(GLBall mylib) 

La réponse de arrowdodger est correcte et préférée à plusieurs resockets. Je voudrais simplement append une alternative à sa réponse:

Vous pouvez append une cible de bibliothèque “imscope” au lieu d’un répertoire de liens. Quelque chose comme:

 # Your-external "mylib", add GLOBAL if the imported library is located in directories above the current. add_library( mylib SHARED IMPORTED ) # You can define two import-locations: one for debug and one for release. set_target_properties( mylib PROPERTIES IMPORTED_LOCATION ${CMAKE_BINARY_DIR}/res/mylib.so ) 

Et puis lien comme si cette bibliothèque avait été construite par votre projet:

 TARGET_LINK_LIBRARIES(GLBall mylib) 

Une telle approche vous donnerait un peu plus de souplesse: jetez un coup d’œil à la commande add_library () et aux nombreuses propriétés cibles associées aux bibliothèques imscopes .

Je ne sais pas si cela résoudra votre problème avec les “versions mises à jour de libs”.

Je suppose que vous voulez foo.dll un lien vers une bibliothèque appelée foo , son nom de fichier est généralement un lien foo.dll ou libfoo.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 de votre bibliothèque. CMake sera en erreur si la bibliothèque a disparu ou a reçu un nouveau nom. Cela permet de détecter rapidement les erreurs et de faire comprendre à l’utilisateur (peut-être vous-même) ce qui cause un problème.
Trouver une bibliothèque foo et stocker le chemin d’access dans FOO_LIB

  find_library(FOO_LIB foo) 

CMake se calculera lui-même le nom du fichier. Il vérifie les endroits habituels comme /usr/lib , /usr/lib64 et les chemins dans PATH .

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 d’access.

Parfois, vous devez append 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 dans FOO_LIB . Vous l’utilisez pour lier la bibliothèque à votre cible mylib comme dans

  target_link_libraries(mylib "${FOO_LIB}") 

Vous pouvez vouloir append PRIVATE , PUBLIC ou INTERFACE devant la bibliothèque, cf. la documentation: https://cmake.org/cmake/help/latest/command/target_link_libraries.html

3. Ajouter comprend (cette étape peut ne pas être 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 target_include_directories avec target_include_directories 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 et find_path par find_package .

Une autre solution, dans le cas où vous travaillez avec l’Appstore, nécessite des «droits» et, par conséquent, vous devez établir un lien avec un framework Apple.

Pour que les droits fonctionnent (par exemple, GameCenter), vous devez avoir un “Link Binary with Libraries” -buildstep, puis créer un lien avec “GameKit.framework”. CMake “injecte” les bibliothèques à un “niveau bas” dans la ligne de commande, donc Xcode ne le sait pas vraiment et vous ne pourrez pas activer GameKit dans l’écran Capabilities.

Une façon d’utiliser CMake et d’avoir un “Link with Binaries” -buildstep consiste à générer xcodeproj avec CMake, puis à utiliser “sed” pour “search & replace” et à append GameKit comme le veut XCode …

Le script ressemble à ceci (pour Xcode 6.3.1).

 s#\/\* Begin PBXBuildFile section \*\/#\/\* Begin PBXBuildFile section \*\/\ 26B12AA11C10544700A9A2BA \/\* GameKit.framework in Frameworks \*\/ = {isa = PBXBuildFile; fileRef = 26B12AA01C10544700A9A2BA \/\* GameKit.framework xxx\*\/; };#g s#\/\* Begin PBXFileReference section \*\/#\/\* Begin PBXFileReference section \*\/\ 26B12AA01C10544700A9A2BA \/\* GameKit.framework xxx\*\/ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GameKit.framework; path = System\/Library\/Frameworks\/GameKit.framework; sourceTree = SDKROOT; };#g s#\/\* End PBXFileReference section \*\/#\/\* End PBXFileReference section \*\/\ \ \/\* Begin PBXFrameworksBuildPhase section \*\/\ 26B12A9F1C10543B00A9A2BA \/\* Frameworks \*\/ = {\ isa = PBXFrameworksBuildPhase;\ buildActionMask = 2147483647;\ files = (\ 26B12AA11C10544700A9A2BA \/\* GameKit.framework in Frameworks xxx\*\/,\ );\ runOnlyForDeploymentPostprocessing = 0;\ };\ \/\* End PBXFrameworksBuildPhase section \*\/\ #g s#\/\* CMake PostBuild Rules \*\/,#\/\* CMake PostBuild Rules \*\/,\ 26B12A9F1C10543B00A9A2BA \/\* Frameworks xxx\*\/,#g s#\/\* Products \*\/,#\/\* Products \*\/,\ 26B12AA01C10544700A9A2BA \/\* GameKit.framework xxx\*\/,#g 

sauvegardez ceci dans “gamecenter.sed” et ensuite “appliquez” ça comme ça (ça change votre xcodeproj!)

 sed -i.pbxprojbak -f gamecenter.sed myproject.xcodeproj/project.pbxproj 

Vous devrez peut-être modifier les commandes de script pour répondre à vos besoins.

Attention: il est probable que la version Xcode soit différente car le format du projet pourrait changer, le numéro unique (codé en dur) pourrait ne pas être unique – et généralement les solutions des autres utilisateurs sont meilleures – donc à moins de supporter Appstore + Droits (et builds automatisés), ne faites pas cela.

Ceci est un bogue de CMake, voir http://cmake.org/Bug/view.php?id=14185 et http://gitlab.kitware.com/cmake/cmake/issues/14185