Collega un target a determinate librerie.
target_link_libraries(<target> ]] <item>] ...)
Specifica librerie o flag da usare quando si collega un dato target. Il nome <target>
deve essere stato creato nella directory corrente da un comando come add_executable()
o add_library()
. Gli altri argomenti specificano nomi di librerie o flag. Chiamate ripetute per la stessa <target>
aggiungono elementi nell’ordine in cui sono state chiamate.
Se il nome di una libreria corrisponde a quello di un altro obiettivo nel progetto, verrà automaticamente aggiunta una dipendenza nel sistema di compilazione per assicurarsi che la libreria da collegare sia aggiornata prima che l’obiettivo si colleghi. I nomi degli elementi che iniziano con -
, ma non -l
o -framework
, sono trattati come flags di collegamento.
Una parola chiave debug
, optimized
o general
indica che la libreria che la segue immediatamente deve essere usata solo per la configurazione di build corrispondente. La parola chiave debug
corrisponde alla configurazione Debug (o alle configurazioni nominate nella proprietà globaleDEBUG_CONFIGURATIONS
se è impostata). La parola chiaveoptimized
corrisponde a tutte le altre configurazioni. La parola chiavegeneral
corrisponde a tutte le configurazioni, ed è puramente facoltativa (assunta se omessa). Una maggiore granularità può essere ottenuta per le regole per configurazione creando e collegando a obiettivi di libreriaIMPORTED.
Le dipendenze della biblioteca sono transitive per impostazione predefinita con questa firma.Quando questo obiettivo è collegato ad un altro obiettivo, allora le librerie collegate a questo obiettivo appariranno sulla linea di collegamento anche per l’altro obiettivo. Questa “interfaccia di collegamento” transitiva è memorizzata nella proprietàINTERFACE_LINK_LIBRARIES
del target e può essere annullata impostando direttamente la proprietà. Quando CMP0022
non è impostato aNEW
, il collegamento transitivo è incorporato ma può essere sovrascritto dalla proprietàLINK_INTERFACE_LIBRARIES
. Le chiamate ad altre firme di questo comando possono impostare la proprietà che rende private tutte le librerie linkate esclusivamente da questa firma.
CMake propagherà anche i requisiti d’uso dalle librerie collegate. I requisiti d’uso delle dipendenze influenzano la compilazione dei sorgenti nella <target>
.
Se una <item>
è una libreria in un framework Mac OX, la Headers
directory del framework sarà anche processata come requisito d’uso. Questo ha lo stesso effetto del passaggio della directory del framework come directory di inclusione.
target_link_libraries(<target> <PRIVATE|PUBLIC|INTERFACE> <lib> ... ...])
Le parole chiave PUBLIC
, PRIVATE
e INTERFACE
possono essere usate per specificare sia le dipendenze di collegamento che l’interfaccia di collegamento in un solo comando.Le librerie e i target che seguono PUBLIC
sono collegati a, e sono resi parte dell’interfaccia di collegamento. Le biblioteche e gli obiettivi che seguono PRIVATE
sono collegati a, ma non sono resi parte dell’interfaccia di collegamento. Le librerie che seguono INTERFACE
sono aggiunte all’interfaccia di collegamento e non sono usate per il collegamento <target>
.
target_link_libraries(<target> LINK_INTERFACE_LIBRARIES <lib>] ...)
La modalità LINK_INTERFACE_LIBRARIES
aggiunge le librerie alla proprietàINTERFACE_LINK_LIBRARIES
di destinazione invece di usarle per il collegamento. Se la politica CMP0022
non è NEW
, allora questa modalità aggiunge anche le librerie alla LINK_INTERFACE_LIBRARIES
e alla sua configurazione equivalente.
Questa firma è solo per compatibilità. Preferite invece la modalità INTERFACE
.
Le librerie specificate come debug
sono avvolte in un’espressione generatrice per corrispondere alle build di debug. Se la policy CMP0022
non è NEW
, le librerie sono anche aggiunte alla proprietàLINK_INTERFACE_LIBRARIES_DEBUG
(o alle proprietà corrispondenti alle configurazioni elencate nella proprietà globale DEBUG_CONFIGURATIONS
se è impostata).Le librerie specificate come optimized
sono aggiunte alla proprietàINTERFACE_LINK_LIBRARIES
. Se la policy CMP0022
non è NEW
, sono anche aggiunte alla proprietàLINK_INTERFACE_LIBRARIES
. Le librerie specificate comegeneral
(o senza alcuna parola chiave) sono trattate come se fossero specificate sia perdebug
che per optimized
.
target_link_libraries(<target> <LINK_PRIVATE|LINK_PUBLIC> <lib>] ... <lib>] ...])
I modi LINK_PUBLIC
e LINK_PRIVATE
possono essere usati per specificare sia le dipendenze del link che l’interfaccia del link in un comando.
Questa firma è solo per compatibilità. Preferire invece le parole chiave PUBLIC
oPRIVATE
.
Le biblioteche e i target che seguono LINK_PUBLIC
sono collegati a, e sono resi parte del INTERFACE_LINK_LIBRARIES
. Se la politicaCMP0022
non è NEW
, sono anche resi parte della LINK_INTERFACE_LIBRARIES
. Le librerie e gli obiettivi che seguonoLINK_PRIVATE
sono collegati a, ma non sono resi parte diINTERFACE_LINK_LIBRARIES
(o LINK_INTERFACE_LIBRARIES
).
Il grafico delle dipendenze delle librerie è normalmente aciclico (un DAG), ma nel caso di librerie STATIC
dipendenti l’una dall’altra CMake permette al grafico di contenere cicli (componenti fortemente connessi). Quando un’altra destinazione si collega a una delle librerie, CMake ripete l’intero componente collegato.Per esempio, il codice
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)
collega main
a A B A B
. Mentre una ripetizione è solitamente sufficiente, le disposizioni patologiche dei file oggetto e dei simboli possono richiederne di più. Si possono gestire questi casi ripetendo manualmente il componente nell’ultima chiamata target_link_libraries
. Tuttavia, se due archivi sono davvero così interdipendenti, dovrebbero probabilmente essere combinati in un unico archivio.
Gli argomenti per target_link_libraries possono usare “espressioni generatrici” con la sintassi $<...>
. Si noti tuttavia che le espressioni generatrici non saranno usate nella gestione OLD di CMP0003
o CMP0004
. Vedere il manuale cmake-generator-expressions(7)
per le espressioni disponibili. Vedere il manuale cmake-buildsystem(7)
per maggiori informazioni sulla definizione delle proprietà del buildsystem.
Lascia un commento