Linkitä kohde tiettyihin kirjastoihin.
target_link_libraries(<target> ]] <item>] ...)
Määritä kirjastot tai liput, joita käytetään linkitettäessä tiettyä kohdetta. Thenamed <target>
on oltava luotu nykyiseen hakemistoon komennolla kuten add_executable()
tai add_library()
. Jäljellä olevat argumentit määrittävät kirjastojen nimet tai liput. Toistuvat kutsut samalle <target>
:lle lisäävät kohteet kutsutusjärjestyksessä.
Jos kirjaston nimi vastaa projektin toisen kohteen nimeä, riippuvuus lisätään automaattisesti build-järjestelmään, jotta varmistetaan, että linkitettävä kirjasto on ajan tasalla ennen kohteen linkittämistä. Kohteiden nimiä, jotka alkavat -
:llä, mutta eivät -l
:llä tai -framework
:llä, käsitellään linkityslippuina.
Avainsana debug
, optimized
tai general
ilmaisee, että sitä välittömästi seuraavaa kirjastoa käytetään vain vastaavassa rakennuskonfiguraatiossa. Avainsana debug
vastaa Debug-konfiguraatiota (tai globaalissa ominaisuudessaDEBUG_CONFIGURATIONS
mainittuja konfiguraatioita, jos se on asetettu). Avainsanaoptimized
vastaa kaikkia muita konfiguraatioita. Avainsanageneral
vastaa kaikkia konfiguraatioita, ja se on puhtaasti valinnainen (oletetaan, jos se jätetään pois). Suurempi rakeisuus voidaan saavuttaa konfiguraatiokohtaisten sääntöjen osalta luomalla ja linkittämälläIMPORTED-kirjastokohteisiin.
Kirjastoriippuvuudet ovat oletusarvoisesti transitiivisia tällä allekirjoituksella.Kun tämä kohde linkitetään toiseen kohteeseen, kirjastot, jotka on linkitetty tähän kohteeseen, näkyvät myös toisen kohteen linkkirivillä. Tämä transitiivinen ”linkkirajapinta” on tallennettuINTERFACE_LINK_LIBRARIES
target-ominaisuuteen ja se voidaan ohittaa asettamalla ominaisuus suoraan. Kun CMP0022
ei ole asetettuNEW
:ksi, transitiivinen linkitys on sisäänrakennettu, mutta se voidaan ohittaaLINK_INTERFACE_LIBRARIES
-ominaisuudella. Tämän komennon muiden allekirjoitusten kutsut voivat asettaa ominaisuuden, joka tekee kaikista kirjastoista, jotka on linkitetty yksinomaan tällä allekirjoituksella, yksityisiä.
CMake myös levittää käyttövaatimuksia linkitetyistä kirjastokohteista. Riippuvuuksien käyttövaatimukset vaikuttavat <target>
lähteiden kääntämiseen.
Jos <item>
on kirjasto Mac OX -kehyksessä, myös Headers
kehyksen Headers
hakemisto käsitellään käyttövaatimuksena. Tällä on sama vaikutus kuin frame-hakemiston välittämisellä include-hakemistona.
target_link_libraries(<target> <PRIVATE|PUBLIC|INTERFACE> <lib> ... ...])
Avainsanoja PUBLIC
, PRIVATE
ja INTERFACE
voidaan käyttää sekä linkitysriippuvuuksien että linkitysrajapinnan määrittämiseen yhdellä komennolla.PUBLIC
jälkeiset kirjastot ja kohteet linkitetään ja niistä tehdään osa linkitysrajapintaa. Kirjastot ja kohteet, jotka seuraavat PRIVATE
, linkitetään, mutta niistä ei tehdä osaa linkitysrajapinnasta. INTERFACE
jälkeiset kirjastot liitetään linkitysrajapintaan, eikä niitä käytetä linkittämiseen <target>
.
target_link_libraries(<target> LINK_INTERFACE_LIBRARIES <lib>] ...)
Tilassa LINK_INTERFACE_LIBRARIES
kirjastot liitetään INTERFACE_LINK_LIBRARIES
-kohdeominaisuuteen sen sijaan, että niitä käytettäisiin linkittämiseen. Jos käytäntö CMP0022
ei ole NEW
, tämä tila liittää kirjastot myös LINK_INTERFACE_LIBRARIES
:een ja senper-konfiguraatiota vastaavaan.
Tämä allekirjoitus on vain yhteensopivuuden vuoksi. Suosi sen sijaan INTERFACE
-moodia.
Kirjastot, jotka on määritetty muodossa debug
, kääritään generaattorilausekkeeseen debug-rakentamista varten. Jos käytäntö CMP0022
ei ole NEW
, kirjastot liitetään myös LINK_INTERFACE_LIBRARIES_DEBUG
ominaisuuteen (tai globaalissa DEBUG_CONFIGURATIONS
-ominaisuudessa lueteltuja konfiguraatioita vastaaviin ominaisuuksiin, jos se on asetettu).optimized
-merkinnällä määritetyt kirjastot liitetään INTERFACE_LINK_LIBRARIES
-ominaisuuteen. Jos käytäntö CMP0022
ei ole NEW
, ne liitetään myösLINK_INTERFACE_LIBRARIES
-ominaisuuteen. Kirjastoja, jotka on määritetty muodossageneral
(tai ilman mitään avainsanaa), käsitellään ikään kuin ne olisi määritetty sekädebug
:lle että optimized
:lle.
target_link_libraries(<target> <LINK_PRIVATE|LINK_PUBLIC> <lib>] ... <lib>] ...])
Tiloja LINK_PUBLIC
ja LINK_PRIVATE
voidaan käyttää sekä linkkiriippuvuuksien että linkkiliitännän määrittämiseen yhdellä komennolla.
Tämä allekirjoitus on vain yhteensopivuuden vuoksi. Käytä sen sijaan mieluummin PUBLIC
– tai PRIVATE
-avainsanoja.
Kirjastot ja kohteet, jotka seuraavat LINK_PUBLIC
-avainsanaa, linkitetään ja niistä tehdään osa INTERFACE_LINK_LIBRARIES
-avainsanaa. Jos käytäntöCMP0022
ei ole NEW
, niistä tehdään myös osaLINK_INTERFACE_LIBRARIES
. Kirjastot ja kohteet, jotka seuraavatLINK_PRIVATE
linkitetään, mutta niistä ei tehdä osaaINTERFACE_LINK_LIBRARIES
:stä (tai LINK_INTERFACE_LIBRARIES
:stä).
Kirjastojen riippuvuusgraafi on normaalisti asyklinen (DAG), mutta jos kyseessä ovat toisistaan riippuvaiset STATIC
-kirjastot, CMake sallii, että graafi voi sisältää syklejä (vahvasti kytkeytyneitä osia). Kun toinen kohde linkittyy johonkin kirjastoon, CMake toistaa koko yhdistetyn komponentin. esimerkiksi koodi
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)
linkittää main
kirjastoon A B A B
. Yksi toisto riittää yleensä, mutta patologiset objektitiedosto- ja symbolijärjestelyt voivat vaatia useampia toistoja. Tällaiset tapaukset voidaan hoitaa toistamalla komponentti manuaalisesti viimeisessä target_link_libraries
-kutsussa. Jos kuitenkin kaksi arkistoa ovat todella niin riippuvaisia toisistaan, ne pitäisi luultavasti yhdistää yhdeksi arkistoksi.
Argumentit target_link_librariesille voivat käyttää ”generaattorilausekkeita”, joiden syntaksi on $<...>
. Huomaa kuitenkin, että generaattorilausekkeita ei käytetä CMP0003
:n tai CMP0004
:n OLD-käsittelyssä.Katso käytettävissä olevat lausekkeet cmake-generator-expressions(7)
-käsikirjasta. Lisätietoja buildsystem-ominaisuuksien määrittelystä on cmake-buildsystem(7)
-käsikirjassa.
.
Vastaa