Link een target aan gegeven bibliotheken.
target_link_libraries(<target> ]] <item>] ...)
Specifieer bibliotheken of vlaggen om te gebruiken bij het linken van een gegeven target. De naam <target>
moet in de huidige directory zijn aangemaakt door een commando zoals add_executable()
of add_library()
. De overige argumenten specificeren bibliotheeknamen of vlaggen. Herhaalde aanroepen voor dezelfde <target>
voegen items toe in de volgorde van aanroepen.
Als de naam van een bibliotheek overeenkomt met die van een ander doel in het project, wordt automatisch een afhankelijkheid toegevoegd in het bouwsysteem om er zeker van te zijn dat de bibliotheek die gelinkt wordt up-to-date is voordat het doel linkt. Itemnamen die beginnen met -
, maar niet -l
of -framework
, worden behandeld als linker flags.
Een debug
, optimized
, of general
sleutelwoord geeft aan dat de bibliotheek die er direct achteraan komt alleen gebruikt moet worden voor de corresponderende build configuratie. Het debug
sleutelwoord komt overeen met de Debug configuratie (of met configuraties genoemd in de globale eigenschapDEBUG_CONFIGURATIONS
als deze is ingesteld). Het sleutelwoordoptimized
komt overeen met alle andere configuraties. Het sleutelwoordgeneral
komt overeen met alle configuraties, en is puur optioneel (aangenomen indien weggelaten). Hogere granulariteit kan worden bereikt voor per-configuratie regels door het maken van en linken naarIMPORTED bibliotheek targets.
Bibliotheek afhankelijkheden zijn standaard transitief met deze signatuur.Wanneer dit target wordt gelinkt naar een ander target dan zullen de bibliotheken gelinkt aan dit target ook verschijnen op de link regel voor het andere target. Deze transitieve “link interface” is opgeslagen in deINTERFACE_LINK_LIBRARIES
target eigenschap en kan worden opgeheven door de eigenschap direct in te stellen. Wanneer CMP0022
niet ingesteld is opNEW
, is transitief linken ingebouwd maar kan overschreven worden door deLINK_INTERFACE_LIBRARIES
eigenschap. Aanroepen van andere handtekeningen van dit commando kunnen de eigenschap instellen waardoor alle bibliotheken die exclusief door deze handtekening zijn gekoppeld privé worden.
CMake zal ook gebruiksvereisten van gekoppelde bibliotheekdoelen propageren. Gebruiksvereisten van afhankelijkheden beïnvloeden de compilatie van bronnen in de <target>
.
Als een <item>
een bibliotheek is in een Mac OX framework, zal de Headers
directory van het framework ook worden verwerkt als ausageis. Dit heeft hetzelfde effect als het doorgeven van de framework directory als een include directory.
target_link_libraries(<target> <PRIVATE|PUBLIC|INTERFACE> <lib> ... ...])
De PUBLIC
, PRIVATE
en INTERFACE
sleutelwoorden kunnen worden gebruikt om zowel de link afhankelijkheden als de link interface in een commando aan te geven.Bibliotheken en targets die volgen op PUBLIC
worden gelinkt, en maken deel uit van de link interface. Bibliotheken en targets die volgen op PRIVATE
worden gelinkt, maar maken geen deel uit van de koppelingsinterface. Bibliotheken die volgen op INTERFACE
worden toegevoegd aan de koppelingsinterface en worden niet gebruikt voor het koppelen <target>
.
target_link_libraries(<target> LINK_INTERFACE_LIBRARIES <lib>] ...)
De LINK_INTERFACE_LIBRARIES
-modus voegt de bibliotheken toe aan deINTERFACE_LINK_LIBRARIES
-doel-eigenschap in plaats van ze te gebruiken voor het koppelen. Als beleid CMP0022
niet NEW
is, dan voegt deze modus ook bibliotheken toe aan de LINK_INTERFACE_LIBRARIES
en zijn per-configuratie equivalent.
Deze handtekening is alleen voor compatibiliteit. Geef de voorkeur aan de INTERFACE
mode.
Bibliotheken gespecificeerd als debug
zijn verpakt in een generator expressie om te corresponderen met debug builds. Als beleid CMP0022
niet NEW
is, worden de bibliotheken ook toegevoegd aan de eigenschap LINK_INTERFACE_LIBRARIES_DEBUG
(of aan de eigenschappen die overeenkomen met configuraties vermeld in de globale eigenschap DEBUG_CONFIGURATIONS
als deze is ingesteld).Bibliotheken gespecificeerd als optimized
worden toegevoegd aan de eigenschapINTERFACE_LINK_LIBRARIES
. Als beleid CMP0022
niet NEW
is, worden ze ook toegevoegd aan de eigenschapLINK_INTERFACE_LIBRARIES
. Bibliotheken gespecificeerd alsgeneral
(of zonder enig sleutelwoord) worden behandeld alsof ze zijn gespecificeerd voor zoweldebug
als optimized
.
target_link_libraries(<target> <LINK_PRIVATE|LINK_PUBLIC> <lib>] ... <lib>] ...])
De modi LINK_PUBLIC
en LINK_PRIVATE
kunnen worden gebruikt om zowel de link afhankelijkheden als de link interface in één commando op te geven.
Deze signatuur is alleen voor compatibiliteit. Geef de voorkeur aan de PUBLIC
ofPRIVATE
sleutelwoorden.
Bibliotheken en targets die volgen op LINK_PUBLIC
worden gelinkt, en worden onderdeel gemaakt van de INTERFACE_LINK_LIBRARIES
. Als policyCMP0022
niet NEW
is, worden ze ook onderdeel van deLINK_INTERFACE_LIBRARIES
. Bibliotheken en targets die volgen opLINK_PRIVATE
worden gelinkt, maar worden geen onderdeel van deINTERFACE_LINK_LIBRARIES
(of LINK_INTERFACE_LIBRARIES
).
De library dependency graph is normaal gesproken acyclisch (een DAG), maar in het geval van wederzijds afhankelijke STATIC
bibliotheken staat CMake toe dat de graph cycli bevat (sterk verbonden componenten). Wanneer een ander doel koppelt aan een van de bibliotheken, herhaalt CMake de gehele gekoppelde component. Bijvoorbeeld, de 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)
koppelt main
aan A B A B
. Hoewel één herhaling meestal voldoende is, kunnen pathologische object-bestands- en symbool-schikkingen meer vereisen. Men kan dergelijke gevallen behandelen door handmatig de component te herhalen in de laatste target_link_libraries
aanroep. Echter, als twee archieven echt zo van elkaar afhankelijk zijn, moeten ze waarschijnlijk worden gecombineerd in een enkel archief.
Argumenten voor target_link_libraries mogen “generator expressions “gebruiken met de syntax $<...>
. Merk echter op dat generator expressies niet zullen worden gebruikt in OLD behandeling van CMP0003
of CMP0004
.Zie de cmake-generator-expressions(7)
handleiding voor beschikbare expressies. Zie de cmake-buildsystem(7)
handleiding voor meer informatie over het definiëren van buildsystem properties.
Geef een antwoord