Legitimează o țintă la anumite biblioteci.
target_link_libraries(<target> ]] <item>] ...)
Specificați bibliotecile sau stegulețele care trebuie folosite la legarea unei anumite ținte. Thenamed <target>
trebuie să fi fost creat în directorul curent de către o comandă precum add_executable()
sau add_library()
. Argumentele următoare specifică numele bibliotecilor sau stegulețele. Apelurile repetate pentru același <target>
adaugă elementele în ordinea în care au fost apelate.
Dacă un nume de bibliotecă se potrivește cu cel al unei alte ținte din proiect, o dependență va fi adăugată automat în sistemul de construire pentru a se asigura că biblioteca care se leagă este actualizată înainte ca ținta să se lege. Numele elementelor care încep cu -
, dar nu și -l
sau -framework
, sunt tratate ca stegulețe de legătură.
Un cuvânt cheie debug
, optimized
sau general
indică faptul că biblioteca care urmează imediat după el va fi utilizată numai pentru configurația de construire corespunzătoare. Cuvântul cheie debug
corespunde configurației Debug (sau configurațiilor numite în proprietatea globală DEBUG_CONFIGURATIONS
, dacă aceasta este setată). Cuvântul cheieoptimized
corespunde tuturor celorlalte configurații. Cuvântul cheiegeneral
corespunde tuturor configurațiilor și este pur opțional (se presupune dacă este omis). O granularitate mai mare poate fi obținută pentru regulile per configurație prin crearea și legarea la ținte de bibliotecăIMPORTED.
Dependențele de bibliotecă sunt tranzitive în mod implicit cu această semnătură.Când această țintă este legată într-o altă țintă, atunci bibliotecile legate de această țintă vor apărea pe linia de legătură și pentru cealaltă țintă. Această „interfață de legătură” tranzitivă este stocată în proprietateaINTERFACE_LINK_LIBRARIES
target și poate fi anulată prin setarea directă a proprietății. Atunci când CMP0022
nu este setat laNEW
, legătura tranzitivă este încorporată, dar poate fi anulată prin proprietateaLINK_INTERFACE_LIBRARIES
. Apelurile către alte semnături ale acestei comenzi pot seta proprietatea care face ca orice bibliotecă legată exclusiv prin această semnătură să fie privată.
CMake va propaga, de asemenea, cerințele de utilizare de la țintele bibliotecilor legate. Cerințele de utilizare a dependențelor afecteazăcompilarea surselor din <target>
.
Dacă o <item>
este o bibliotecă într-un cadru Mac OX, directorul Headers
al cadrului va fi, de asemenea, procesat ca cerință de utilizare. Acest lucru are acelașiefect ca și trecerea directorului cadrului ca director de includere.
target_link_libraries(<target> <PRIVATE|PUBLIC|INTERFACE> <lib> ... ...])
Celelalte cuvinte cheie PUBLIC
, PRIVATE
și INTERFACE
pot fi folosite pentru a specifica atât dependențele de legătură, cât și interfața de legătură într-o singură comandă.Bibliotecile și țintele care urmează după PUBLIC
sunt legate și fac parte din interfața de legătură. Bibliotecile și țintele care urmează PRIVATE
sunt legate, dar nu fac parte din interfața de legătură. Bibliotecile care urmează după INTERFACE
sunt adăugate la interfața de legătură și nu sunt utilizate pentru legarea <target>
.
target_link_libraries(<target> LINK_INTERFACE_LIBRARIES <lib>] ...)
Modul LINK_INTERFACE_LIBRARIES
adaugă bibliotecile la proprietatea țintăINTERFACE_LINK_LIBRARIES
în loc să le utilizeze pentru legare. Dacă politica CMP0022
nu este NEW
, atunci și acest mod adaugă bibliotecile la LINK_INTERFACE_LIBRARIES
și la echivalentul săuper-configurare.
Această semnătură este doar pentru compatibilitate. Preferați modul INTERFACE
în loc de INTERFACE
.
Bibliotecile specificate ca debug
sunt înfășurate într-o expresie generatoare pentru a corespunde construcțiilor de depanare. Dacă politica CMP0022
nu este NEW
, bibliotecile sunt, de asemenea, adăugate la proprietateaLINK_INTERFACE_LIBRARIES_DEBUG
(sau la proprietățile care corespund configurațiilor enumerate în proprietatea globală DEBUG_CONFIGURATIONS
dacă aceasta este setată).Bibliotecile specificate ca optimized
sunt adăugate la proprietateaINTERFACE_LINK_LIBRARIES
. Dacă politica CMP0022
nu este NEW
, acestea sunt, de asemenea, anexate la proprietateaLINK_INTERFACE_LIBRARIES
. Bibliotecile specificate cageneral
(sau fără nici un cuvânt cheie) sunt tratate ca și cum ar fi fost specificate atât pentrudebug
, cât și pentru optimized
.
target_link_libraries(<target> <LINK_PRIVATE|LINK_PUBLIC> <lib>] ... <lib>] ...])
Modelele LINK_PUBLIC
și LINK_PRIVATE
pot fi folosite pentru a specifica atât dependențele de legătură, cât și interfața de legătură într-o singură comandă.
Această semnătură este doar pentru compatibilitate. Preferați în schimb cuvintele cheie PUBLIC
sauPRIVATE
.
Bibliotecile și țintele care urmează LINK_PUBLIC
sunt legate și fac parte din INTERFACE_LINK_LIBRARIES
. Dacă politicaCMP0022
nu este NEW
, acestea sunt, de asemenea, făcute parte dinLINK_INTERFACE_LIBRARIES
. Bibliotecile și țintele care urmează dupăLINK_PRIVATE
sunt legate la, dar nu fac parte dinINTERFACE_LINK_LIBRARIES
(sau LINK_INTERFACE_LIBRARIES
).
Graful de dependență a bibliotecilor este în mod normal aciclic (un DAG), dar în cazul bibliotecilor STATIC
reciproc dependente CMake permite ca graful să conțină cicluri (componente puternic conectate). Atunci când o altă țintă se leagă la una dintre biblioteci, CMake repetă întreaga componentă conectată. de exemplu, codul
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)
leagă main
de A B A B
. În timp ce o singură repetiție este de obicei suficientă, aranjamentele patologice ale fișierelor de obiecte și simboluri pot necesita mai multe. Astfel de cazuri pot fi tratate prin repetarea manuală a componentei în ultimul apel target_link_libraries
. Cu toate acestea, dacă două arhive sunt cu adevărat atât de interdependente, ele ar trebui probabil să fie combinate într-o singură arhivă.
Argumentele către target_link_libraries pot folosi „expresii generatoare” cu sintaxa $<...>
. Rețineți totuși că expresiile generatoare nu vor fi utilizate în gestionarea OLD a CMP0003
sau CMP0004
.Consultați manualul cmake-generator-expressions(7)
pentru expresiile disponibile. A se vedea manualul cmake-buildsystem(7)
pentru mai multe informații privind definirea proprietăților sistemului de compilare.
Lasă un răspuns