Link et mål til givne biblioteker.
target_link_libraries(<target> ]] <item>] ...)
Specificer biblioteker eller flag, der skal bruges ved linkning af et givet mål. Thenamed <target>
skal være oprettet i den aktuelle mappe af en kommando som add_executable()
eller add_library()
. De resterende argumenter angiver biblioteksnavne eller flag. Gentagne kald til det samme <target>
tilføjer elementer i den rækkefølge, de er kaldt.
Hvis et biblioteksnavn passer til et andet mål i projektet, vil en afhængighed automatisk blive tilføjet i build-systemet for at sikre, at det bibliotek, der linkes, er opdateret, før målet linkes. Elementnavne, der begynder med -
, men ikke -l
eller -framework
, behandles som linker-flag.
Et nøgleord debug
, optimized
eller general
angiver, at det bibliotek, der følger umiddelbart efter det, kun skal bruges til den tilsvarende byggekonfiguration. Nøgleordet debug
svarer til Debug-konfigurationen (eller til konfigurationer, der er nævnt i den globale egenskab DEBUG_CONFIGURATIONS
, hvis den er indstillet). Nøgleordet optimized
svarer til alle andre konfigurationer. Nøgleordetgeneral
svarer til alle konfigurationer og er rent valgfrit (antaget, hvis det er udeladt). Der kan opnås en højere granularitet for regler pr. konfiguration ved at oprette og linke tilIMPORTED-biblioteksmål.
Biblioteksafhængigheder er som standard transitive med denne signatur.Når dette mål linkes til et andet mål, vil de biblioteker, der er linket til dette mål, også blive vist på linklinjen for det andet mål. Denne transitive “linkgrænseflade” er gemt i INTERFACE_LINK_LIBRARIES
target-egenskaben og kan tilsidesættes ved at indstille egenskaben direkte. Når CMP0022
ikke er sat tilNEW
, er transitiv linking indbygget, men kan overstyres af egenskabenLINK_INTERFACE_LIBRARIES
. Kald til andre signaturer af denne kommando kan indstille egenskaben, der gør alle biblioteker, der udelukkende linkes af denne signatur, private.
CMake vil også propagere brugskrav fra linkede biblioteksmål. Brugskrav for afhængigheder påvirker kompilering af kilder i <target>
.
Hvis et <item>
er et bibliotek i en Mac OX-ramme, vil Headers
mappen i rammen også blive behandlet som et brugskrav. Dette har samme virkning som at overdrage rammekataloget som et include-mappe.
target_link_libraries(<target> <PRIVATE|PUBLIC|INTERFACE> <lib> ... ...])
Nøgleordene PUBLIC
, PRIVATE
og INTERFACE
kan bruges til at angive både link-afhængigheder og link-grænsefladen i én kommando.Biblioteker og mål efter PUBLIC
linkes til og er en del af link-grænsefladen. Biblioteker og mål, der følger PRIVATE
, linkes til, men er ikke en del af linkgrænsefladen. Biblioteker, der følger INTERFACE
, føjes til linkgrænsefladen og bruges ikke til linkning af <target>
.
target_link_libraries(<target> LINK_INTERFACE_LIBRARIES <lib>] ...)
Med LINK_INTERFACE_LIBRARIES
-tilstanden føjes bibliotekerne til INTERFACE_LINK_LIBRARIES
-målegenskaben i stedet for at bruge dem til linkning af <target>
. Hvis politik CMP0022
ikke er NEW
, føjer denne tilstand også biblioteker til LINK_INTERFACE_LIBRARIES
og detper-konfiguration tilsvarende.
Denne signatur er kun til brug for kompatibilitet. Foretrækker INTERFACE
-tilstand i stedet.
Biblioteker, der er angivet som debug
, er indpakket i et generatorudtryk for at svare til debug builds. Hvis politik CMP0022
ikke er NEW
, tilføjes bibliotekerne også til egenskaben LINK_INTERFACE_LIBRARIES_DEBUG
(eller til de egenskaber, der svarer til de konfigurationer, der er angivet i den globale egenskab DEBUG_CONFIGURATIONS
, hvis den er angivet).Biblioteker, der er angivet som optimized
, tilføjes til egenskaben INTERFACE_LINK_LIBRARIES
. Hvis politik CMP0022
ikke er NEW
, tilføjes de også til egenskabenLINK_INTERFACE_LIBRARIES
. Biblioteker, der er angivet somgeneral
(eller uden nøgleord), behandles som om de er angivet for bådedebug
og optimized
.
target_link_libraries(<target> <LINK_PRIVATE|LINK_PUBLIC> <lib>] ... <lib>] ...])
LINK_PUBLIC
og LINK_PRIVATE
-tilstandene kan bruges til at angive både link-afhængigheder og link-grænseflade i én kommando.
Denne signatur er kun til brug for kompatibilitet. Foretrækker nøgleordene PUBLIC
ellerPRIVATE
i stedet.
Biblioteker og mål efter LINK_PUBLIC
linkes til, og gøres til en del af INTERFACE_LINK_LIBRARIES
. Hvis policyCMP0022
ikke er NEW
, bliver de også gjort til en del afLINK_INTERFACE_LIBRARIES
. Biblioteker og mål efterLINK_PRIVATE
linkes til, men gøres ikke til en del afINTERFACE_LINK_LIBRARIES
(eller LINK_INTERFACE_LIBRARIES
).
Biblioteksafhængighedsgrafen er normalt acyklisk (en DAG), men i tilfælde af gensidigt afhængige STATIC
biblioteker tillader CMake, at grafen kan indeholde cyklusser (stærkt forbundne komponenter). Når et andet mål linker til et af bibliotekerne, gentager CMake hele den forbundne komponent, f.eks. koden
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)
forbinder main
med A B A B
. Mens én gentagelse normalt er tilstrækkelig, kan patologiske objektfiler og symbolarrangementer kræve flere. Man kan håndtere sådanne tilfælde ved manuelt at gentage komponenten i det sidste target_link_libraries
-opkald. Men hvis to arkiver virkelig er så afhængige af hinanden, bør de sandsynligvis kombineres til et enkelt arkiv.
Argumenter til target_link_libraries kan bruge “generatorudtryk” med syntaksen $<...>
. Bemærk dog, at generatorudtryk ikke vil blive brugt i OLD-håndtering af CMP0003
eller CMP0004
.Se cmake-generator-expressions(7)
manualen for tilgængeligeudtryk. Se cmake-buildsystem(7)
manualen for mere om definition af buildsystem egenskaber.
Skriv et svar