Odkazuje cíl na dané knihovny.
target_link_libraries(<target> ]] <item>] ...)
Určí knihovny nebo příznaky, které se mají použít při linkování daného cíle. Thenamed <target>
musí být v aktuálním adresáři vytvořen příkazem jako add_executable()
nebo add_library()
. Další argumenty určují názvy knihoven nebo příznaky. Opakovaná volání téhož příkazu <target>
doplňují položky v pořadí, v jakém byly volány.
Pokud se název knihovny shoduje s názvem jiného cíle v projektu, bude v systému sestavování automaticky přidána závislost, aby bylo zajištěno, že linkovaná knihovna je aktuální před tím, než se cíl nalinkuje. Názvy položekzačínající -
, ale ne -l
nebo -framework
, jsou považovány za příznaky linkování.
Klíčové slovo debug
, optimized
nebo general
označuje, že knihovna, která za ním bezprostředně následuje, má být použita pouze pro odpovídající konfiguraci sestavení. Klíčové slovo debug
odpovídá konfiguraci Debug (nebo konfiguracím pojmenovaným v globální vlastnostiDEBUG_CONFIGURATIONS
, pokud je nastavena). Klíčové slovooptimized
odpovídá všem ostatním konfiguracím. Klíčové slovogeneral
odpovídá všem konfiguracím a je čistě volitelné (předpokládá se, pokud je vynecháno). Vyšší granularity lze u pravidel pro jednotlivé konfigurace dosáhnout vytvořením a linkováním naIMPORTED cíle knihoven.
Závislosti knihoven jsou ve výchozím nastavení s touto signaturou tranzitivní. když je tento cíl linkován do jiného cíle, pak se knihovny navázané na tento cíl objeví na linkovacím řádku i pro druhý cíl. Toto tranzitivní „linkové rozhraní“ je uloženo ve vlastnostiINTERFACE_LINK_LIBRARIES
target a může být přepsáno přímým nastavením této vlastnosti. Pokud CMP0022
není nastaveno naNEW
, je tranzitivní linkování zabudováno, ale může být přepsáno vlastnostíLINK_INTERFACE_LIBRARIES
. Volání jiných signatur tohoto příkazu může nastavit vlastnost, která činí všechny knihovny linkovanévýhradně touto signaturou soukromými.
CMake bude také propagovat požadavky na použitíz cílů linkovaných knihoven. Požadavky na použití závislostí ovlivňujíkompilaci zdrojů v <target>
.
Pokud je <item>
knihovna ve frameworku Mac OX, bude Headers
adresář frameworku také zpracován jako požadavek na použití. To má stejnýúčinek jako předání adresáře frameworku jako adresáře include.
target_link_libraries(<target> <PRIVATE|PUBLIC|INTERFACE> <lib> ... ...])
Klíčová slova PUBLIC
, PRIVATE
a INTERFACE
mohou být použita pro určení závislostí odkazu i rozhraní odkazu v jednom příkazu. knihovny a cíle následující za PUBLIC
jsou odkazovány a jsou součástí rozhraní odkazu. Knihovny a cíle následující za PRIVATE
se linkují, ale nejsou součástí linkového rozhraní. Knihovnynásledující za INTERFACE
jsou připojeny k linkovacímu rozhraní a nejsou použity pro linkování <target>
.
target_link_libraries(<target> LINK_INTERFACE_LIBRARIES <lib>] ...)
Režim LINK_INTERFACE_LIBRARIES
připojí knihovny k vlastnostiINTERFACE_LINK_LIBRARIES
target, místo aby je použil pro linkování. Pokud zásada CMP0022
není NEW
, pak tento režimpřipojí knihovny také k LINK_INTERFACE_LIBRARIES
a jehokonfiguračnímu ekvivalentu.
Tento podpis je pouze pro kompatibilitu. Místo toho upřednostněte režim INTERFACE
.
Knihovny uvedené jako debug
jsou zabaleny do výrazu generátoru, který odpovídá ladícím sestavám. Pokud zásada CMP0022
není NEW
, jsou knihovny připojeny také k vlastnostiLINK_INTERFACE_LIBRARIES_DEBUG
(nebo k vlastnostem odpovídajícím konfiguracím uvedeným v globální vlastnosti DEBUG_CONFIGURATIONS
, pokud je nastavena). knihovny zadané jako optimized
jsou připojeny k vlastnostiINTERFACE_LINK_LIBRARIES
. Pokud zásada CMP0022
není NEW
, jsou rovněž připojeny k vlastnostiLINK_INTERFACE_LIBRARIES
. S knihovnami zadanými jakogeneral
(nebo bez jakéhokoli klíčového slova) se zachází, jako by byly zadány jak prodebug
, tak pro optimized
.
target_link_libraries(<target> <LINK_PRIVATE|LINK_PUBLIC> <lib>] ... <lib>] ...])
Možnosti LINK_PUBLIC
a LINK_PRIVATE
lze použít k zadání jak závislostí odkazu, tak rozhraní odkazu v jednom příkazu.
Tento podpis je pouze pro kompatibilitu. Místo toho upřednostněte klíčová slova PUBLIC
neboPRIVATE
.
Knihovny a cíle následující po LINK_PUBLIC
jsou linkovány a jsou součástí INTERFACE_LINK_LIBRARIES
. Pokud politikaCMP0022
není NEW
, jsou rovněž učiněny součástíLINK_INTERFACE_LIBRARIES
. Knihovny a cíle následující poLINK_PRIVATE
jsou spojeny, ale nejsou učiněny součástíINTERFACE_LINK_LIBRARIES
(nebo LINK_INTERFACE_LIBRARIES
).
Graf závislostí knihoven je normálně acyklický (DAG), ale v případě vzájemně závislých knihoven STATIC
umožňuje CMake, aby graf obsahoval cykly (silně spojené komponenty). Když se k jedné z knihoven připojí další cíl, CMake zopakuje celou propojenou komponentu, například kód
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)
propojí main
s A B A B
. Zatímco jedno opakování obvyklestačí, patologické uspořádání objektových souborů a symbolů může vyžadovatvíce. Takové případy lze řešit ručním opakováním komponenty vposledním volání target_link_libraries
. Pokud jsou však dva archivy skutečně tak vzájemně závislé, měly by být pravděpodobně spojeny do jednoho archivu.
Argumenty pro target_link_libraries mohou používat „generátorové výrazy „se syntaxí $<...>
. Všimněte si však, že generátorové výrazy nebudou použity při zpracování OLD CMP0003
nebo CMP0004
. dostupné výrazy najdete v příručce cmake-generator-expressions(7)
. Více informací o definování vlastností buildsystému naleznete v příručce cmake-buildsystem(7)
.
.
Napsat komentář