cmake: target_link_libraries utiliser bibliothèque statique non partagé
Est-il possible de dire à cmake pour le lier avec un bibliothèque statique au lieu de partagé?
En haut de mon CMakeLists.txt
j'ai le texte suivant configuré:
set(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES})
Plus tard, j'ai ajouter un fichier binaire, et dites-lui de lier contre tcmalloc
en mode release:
target_link_libraries(${BIN_NAME} optimized tcmalloc_minimal)
L'résultant makefile liens contre la version partagée de tcmalloc
:
$ make VERBOSE=1 | grep tcmalloc
/usr/bin/c++ ... -Wl,-Bdynamic ltcmalloc_minimal
Plus de preuve:
$ ldd app
...
libtcmalloc_minimal.so.4 => /usr/local/lib/libtcmalloc_minimal.so.4 (0x00007eff89733000)
...
À la fois statique et partagé versions de tcmalloc existent:
$ ls -1 /usr/local/lib/libtcmalloc_minimal*
/usr/local/lib/libtcmalloc_minimal.a
/usr/local/lib/libtcmalloc_minimal_debug.a
/usr/local/lib/libtcmalloc_minimal_debug.la
/usr/local/lib/libtcmalloc_minimal_debug.so
/usr/local/lib/libtcmalloc_minimal_debug.so.4
/usr/local/lib/libtcmalloc_minimal_debug.so.4.2.6
/usr/local/lib/libtcmalloc_minimal.la
/usr/local/lib/libtcmalloc_minimal.so
/usr/local/lib/libtcmalloc_minimal.so.4
/usr/local/lib/libtcmalloc_minimal.so.4.2.6
Question:
Comment puis-je configurer cmake pour le lier avec la version statique de tcmalloc
?
OriginalL'auteur Steve Lorimer | 2016-04-20
Vous devez vous connecter pour publier un commentaire.
Si vous avez seulement besoin de supporter les plates-formes Windows, puis cet ancien e-mail de la CMake liste de diffusion à partir de l'une des Kitware développeurs donne la méthode la plus simple. En essence, l'utilisation
find_library()
pour trouver l'emplacement de la bibliothèque réelle, en favorisant les bibliothèques statiques plus partagée celles de liste en premier dans le nom à rechercher. c'est à direVous auriez un lien vers la bibliothèque a trouvé dans la manière habituelle:
Vous pourriez obtenir de plus intelligent sur la façon dont vous définissez la bibliothèque statique nom si vous avez besoin de l'appui des plates-formes où une bibliothèque statique est appelé quelque chose d'autre que
lib???.a
. Vous utilisez CMAKE_STATIC_LIBRARY_PREFIX et CMAKE_STATIC_LIBRARY_SUFFIX variables.Sur Windows, le problème est que vous ne pouvez pas distinguer entre, d'une bibliothèque statique et de la bibliothèque d'importation d'un fichier DLL, comme discuté dans cette vieille question dans le Kitware bug tracker. Les deux ont l'extension de fichier
.lib
, de sorte que vous ne pouvez pas utiliser l'extension de travailler si un fichier est une bibliothèque statique ou pas, à la différence des plateformes Unix, où vous pouvez.OriginalL'auteur Craig Scott
Vous pouvez créer une fonction d'assistance qui définit
CMAKE_FIND_LIBRARY_SUFFIXES
à portée de la fonction (donc, par conséquent, n'affecte pas la portée parent) qui effectue des recherches à la bibliothèque en question et définit une variable de sortie avec le résultatVous pouvez ensuite appeler cette fonction à partir de quelque part dans votre
CMakeLists.txt
pour remplir une variable avec l'emplacement de la bibliothèque.Échec à trouver des résultats dans un dur échec
Vous pouvez ensuite utiliser cette variable dans votre appel à
target_link_libraries
et assurez-vous que vous créez un lien à l'encontre de la version statiqueIci vous pouvez voir le résultat:
OriginalL'auteur Steve Lorimer
Vous devez définir votre CMAKE_FIND_LIBRARY_SUFFIXES variable de cette manière:
car à défaut CMAKE_FIND_LIBRARY_SUFFIXES il est également .donc suffixe (et il me semble pas à la recherche, dans l'ordre d'insertion). Afin de permettre la portabilité d'autres suffixes devrait être ajoutée (voir ici pour les valeurs par défaut de CMAKE_FIND_LIBRARY_SUFFIXES sur différentes plates-formes).
find_library
pas pourtarget_link_libraries
Oui, il faut l'aide de find_library. Habituellement j'utilise find_library de trouver des bibliothèques externes et de les stocker dans des variables CMake; puis-je les ajouter à la cible des bibliothèques à l'aide de variables.
S'il vous plaît pourriez-vous montrer comment donc?
Quelque chose comme ceci: stackoverflow.com/questions/14243524/.... Ensuite, vous devez ajouter la bibliothèque var à TARGET_LINK_LIBRARIES avec ${VAR_LIBRARY_NAME}.Si vous avez des problèmes, essayez d'imprimer variable obtenue par find_library avec le message ( ... ) afin de comprendre si il a trouvé la bonne bibliothèque.
il ne fonctionne pas
OriginalL'auteur Francesco Argese