Lier une cible à des bibliothèques données.
target_link_libraries(<target> ]] <item>] ...)
Spécifier les bibliothèques ou les drapeaux à utiliser lors de la liaison d’une cible donnée. Thenamed <target>
doit avoir été créé dans le répertoire courant par une commande telle que add_executable()
ou add_library()
. Les arguments restants spécifient les noms des bibliothèques ou les drapeaux. Des appels répétés pour le même <target>
ajoutent des éléments dans l’ordre où ils sont appelés.
Si le nom d’une bibliothèque correspond à celui d’une autre cible dans le projet, une dépendance sera automatiquement ajoutée dans le système de construction pour s’assurer que la bibliothèque liée est à jour avant que la cible ne soit liée. Les noms d’éléments commençant par -
, mais pas -l
ou -framework
, sont traités comme des drapeaux de liaison.
Un mot-clé debug
, optimized
ou general
indique que la bibliothèque qui le suit immédiatement doit être utilisée uniquement pour la configuration de construction correspondante. Le mot clé debug
correspond à la configuration Debug (ou aux configurations nommées dans la propriété globaleDEBUG_CONFIGURATIONS
si elle est définie). Le mot-cléoptimized
correspond à toutes les autres configurations. Le mot-clégeneral
correspond à toutes les configurations, et est purement optionnel (supposé si omis). Une granularité plus élevée peut être obtenue pour les règles par configuration en créant et en liant à des cibles de bibliothèquesIMPORTED.
Les dépendances de bibliothèques sont transitives par défaut avec cette signature.Lorsque cette cible est liée à une autre cible, alors les bibliothèques liées à cette cible apparaîtront également sur la ligne de liaison de l’autre cible. Cette « interface de liaison » transitive est stockée dans la propriété de la cibleINTERFACE_LINK_LIBRARIES
et peut être surchargée en définissant directement la propriété. Lorsque CMP0022
n’est pas défini àNEW
, la liaison transitive est intégrée mais peut être remplacée par la propriétéLINK_INTERFACE_LIBRARIES
. Les appels à d’autres signatures de cette commande peuvent définir la propriété rendant privées toutes les bibliothèques liées exclusivement par cette signature.
CMake propagera également les exigences d’utilisation des cibles des bibliothèques liées. Les exigences d’utilisation des dépendances affectent la compilation des sources dans le <target>
.
Si un <item>
est une bibliothèque dans un framework Mac OX, le Headers
répertoire du framework sera également traité comme une exigence d’ausage. Cela a le même effet que de passer le répertoire du framework comme un répertoire d’inclusion.
target_link_libraries(<target> <PRIVATE|PUBLIC|INTERFACE> <lib> ... ...])
Les mots-clés PUBLIC
, PRIVATE
et INTERFACE
peuvent être utilisés pour spécifier à la fois les dépendances de liaison et l’interface de liaison dans une commande.Les bibliothèques et les cibles suivant PUBLIC
sont liées, et font partie de l’interface de liaison. Les bibliothèques et les cibles qui suivent PRIVATE
sont liées, mais ne font pas partie de l’interface de liaison. Les bibliothèques qui suivent INTERFACE
sont ajoutées à l’interface de liaison et ne sont pas utilisées pour la liaison <target>
.
target_link_libraries(<target> LINK_INTERFACE_LIBRARIES <lib>] ...)
Le mode LINK_INTERFACE_LIBRARIES
ajoute les bibliothèques à la propriété de la cibleINTERFACE_LINK_LIBRARIES
au lieu de les utiliser pour la liaison. Si la politique CMP0022
n’est pas NEW
, alors ce mode ajoute également les bibliothèques à la propriété LINK_INTERFACE_LIBRARIES
et son équivalent de configurationper.
Cette signature est pour la compatibilité seulement. Préférez le mode INTERFACE
à la place.
Les bibliothèques spécifiées comme debug
sont enveloppées dans une expression de générateur pourcorrespondre aux builds de débogage. Si la politique CMP0022
n’est pas NEW
, les bibliothèques sont également ajoutées à la propriétéLINK_INTERFACE_LIBRARIES_DEBUG
(ou aux propriétés correspondant aux configurations listées dans la propriété globale DEBUG_CONFIGURATIONS
si elle est définie).Les bibliothèques spécifiées comme optimized
sont ajoutées à la propriétéINTERFACE_LINK_LIBRARIES
. Si la politique CMP0022
n’est pas NEW
, elles sont également ajoutées à la propriétéLINK_INTERFACE_LIBRARIES
. Les bibliothèques spécifiées en tant quegeneral
(ou sans aucun mot-clé) sont traitées comme si elles étaient spécifiées à la fois pourdebug
et optimized
.
target_link_libraries(<target> <LINK_PRIVATE|LINK_PUBLIC> <lib>] ... <lib>] ...])
Les modes LINK_PUBLIC
et LINK_PRIVATE
peuvent être utilisés pour spécifier à la fois les dépendances de liaison et l’interface de liaison dans une commande.
Cette signature est uniquement pour la compatibilité. Préférez les mots-clés PUBLIC
ouPRIVATE
à la place.
Les bibliothèques et les cibles suivant LINK_PUBLIC
sont liées, et font partie de la INTERFACE_LINK_LIBRARIES
. Si la politiqueCMP0022
n’est pas NEW
, elles sont également intégrées à la LINK_INTERFACE_LIBRARIES
. Les bibliothèques et les cibles suivantLINK_PRIVATE
sont liées, mais ne font pas partie de la INTERFACE_LINK_LIBRARIES
(ou LINK_INTERFACE_LIBRARIES
).
Le graphe de dépendance des bibliothèques est normalement acyclique (un DAG), mais dans le cas de bibliothèques STATIC
mutuellement dépendantes, CMake permet au graphe de contenir des cycles (composants fortement connectés). Lorsqu’une autre cible se lie à l’une des bibliothèques, CMake répète l’intégralité du composant connecté.Par exemple, le code
add_library(A STATIC a.c)add_library(B STATIC b.c)target_link_libraries(A B)target_link_libraries(B A)add_executable(main main.c)target_link_libraries(main A)
lie main
à A B A B
. Bien qu’une seule répétition soit généralement suffisante, les arrangements pathologiques de fichiers d’objets et de symboles peuvent en exiger davantage. On peut traiter de tels cas en répétant manuellement le composant dans le dernier appel target_link_libraries
. Cependant, si deux archives sont vraiment si interdépendantes, elles devraient probablement être combinées en une seule archive.
Les arguments à target_link_libraries peuvent utiliser des « expressions génératrices « avec la syntaxe $<...>
. Notez cependant que les expressions génératrices ne seront pas utilisées dans le traitement OLD de CMP0003
ou CMP0004
.Voir le manuel cmake-generator-expressions(7)
pour les expressions disponibles. Voir le manuel cmake-buildsystem(7)
pour plus d’informations sur la définition des propriétés du système de construction.
Laisser un commentaire