Egy célprogram összekapcsolása adott könyvtárakkal.
target_link_libraries(<target> ]] <item>] ...)
Meghatározza az adott célprogram összekapcsolásakor használandó könyvtárakat vagy zászlókat. A <target>
nevet az aktuális könyvtárban egy olyan parancsnak kell létrehoznia, mint a add_executable()
vagy a add_library()
. A további argumentumok könyvtárneveket vagy zászlókat adnak meg. Ugyanannak a <target>
-nek az ismételt hívása a hívás sorrendjében csatolja az elemeket.
Ha egy könyvtár neve megegyezik a projekt egy másik célpontjának nevével, akkor a build rendszer automatikusan hozzáadja a függőséget, hogy a linkelt könyvtár naprakész legyen, mielőtt a célpontot linkelné. A -
-vel kezdődő elemnevek, de a -l
vagy -framework
nem, linker flagként kezelendők.
A debug
, optimized
vagy general
kulcsszó azt jelzi, hogy az azt közvetlenül követő könyvtárat csak a megfelelő építési konfigurációhoz kell használni. A debug
kulcsszó megfelel a Debug konfigurációnak (vagy aDEBUG_CONFIGURATIONS
globális tulajdonságban megnevezett konfigurációknak, ha az be van állítva). Aoptimized
kulcsszó az összes többi konfigurációnak felel meg. Ageneral
kulcsszó minden konfigurációnak megfelel, és tisztán opcionális (elhagyása esetén feltételezett). Nagyobb granularitás érhető el a konfigurációnkénti szabályoknál azIMPORTED könyvtárcélpontok létrehozásával és linkelésével.
A könyvtárfüggőségek alapértelmezés szerint tranzitívak ezzel az aláírással.Amikor ez a célpont egy másik célpontba van linkelve, akkor az ehhez a célponthoz linkelt könyvtárak megjelennek a másik célpont linksorában is. Ez a tranzitív “link interfész” aINTERFACE_LINK_LIBRARIES
target tulajdonságban van tárolva, és felülbírálható a tulajdonság közvetlen beállításával. Ha a CMP0022
nem azNEW
értékre van beállítva, a tranzitív linkelés be van építve, de aLINK_INTERFACE_LIBRARIES
tulajdonsággal felülbírálható. A parancs más szignatúráinak hívásai beállíthatják a tulajdonságot, ami a kizárólag ezzel a szignatúrával linkelt könyvtárakat priváttá teszi.
A
CMake a linkelt könyvtárcélokból származó használati követelményeket is továbbítja. A függőségek használati követelményei hatással vannak a<target>
forrásainak fordítására.
Ha egy <item>
könyvtár egy Mac OX keretrendszerben van, a keretrendszer Headers
könyvtárát is feldolgozza, mint használati követelményt. Ennek ugyanaz a hatása, mint a keretrendszer könyvtárának include könyvtárként való átadásának.
target_link_libraries(<target> <PRIVATE|PUBLIC|INTERFACE> <lib> ... ...])
A PUBLIC
, PRIVATE
és INTERFACE
kulcsszavakkal egy parancsban megadhatók a linkfüggőségek és a linkfelület is.A PUBLIC
után következő könyvtárak és célprogramok linkelésre kerülnek, és a linkfelület részévé válnak. A PRIVATE
után következő könyvtárakat és célpontokat linkelik, de nem válnak a link interfész részévé. A INTERFACE
után következő könyvtárakat a linkelési felülethez csatolják, és nem használják fel a <target>
linkeléshez.
target_link_libraries(<target> LINK_INTERFACE_LIBRARIES <lib>] ...)
A LINK_INTERFACE_LIBRARIES
mód a könyvtárakat aINTERFACE_LINK_LIBRARIES
céltulajdonsághoz csatolja ahelyett, hogy felhasználná őket a linkeléshez. Ha a CMP0022
házirend nem NEW
, akkor ez a módszintén hozzárendeli a könyvtárakat a LINK_INTERFACE_LIBRARIES
és annakper-konfigurációs megfelelőjéhez.
Ez az aláírás csak kompatibilitási célokat szolgál. Helyette inkább a INTERFACE
módot részesítse előnyben.
A debug
-ként megadott könyvtárakat egy generátor kifejezésbe csomagolja, hogy megfeleljen a debug build-eknek. Ha a policy CMP0022
nem NEW
, a könyvtárak aLINK_INTERFACE_LIBRARIES_DEBUG
tulajdonsághoz (vagy a DEBUG_CONFIGURATIONS
globális tulajdonságban felsorolt konfigurációknak megfelelő tulajdonságokhoz, ha az be van állítva) is hozzá lesznek csatolva.A optimized
ként megadott könyvtárak aINTERFACE_LINK_LIBRARIES
tulajdonsághoz lesznek csatolva. Ha a CMP0022
házirend nem NEW
, akkor ezek is aLINK_INTERFACE_LIBRARIES
tulajdonsághoz csatolódnak. Ageneral
-ként (vagy kulcsszó nélkül) megadott könyvtárakat úgy kezeli, mintha mind adebug
, mind a optimized
esetében megadta volna.
target_link_libraries(<target> <LINK_PRIVATE|LINK_PUBLIC> <lib>] ... <lib>] ...])
A LINK_PUBLIC
és LINK_PRIVATE
módok egy parancsban megadhatják mind a linkfüggőségeket, mind a link interfészt.
Az aláírás csak kompatibilitási célokat szolgál. Helyette inkább a PUBLIC
vagyPRIVATE
kulcsszavakat használja.
A LINK_PUBLIC
után következő könyvtárak és célpontok linkelve vannak, és a INTERFACE_LINK_LIBRARIES
részévé válnak. Ha a policyCMP0022
nem NEW
, akkor ezek is aLINK_INTERFACE_LIBRARIES
részévé válnak. ALINK_PRIVATE
utáni könyvtárak és célpontok kapcsolódnak, de nem válnak aINTERFACE_LINK_LIBRARIES
(vagy LINK_INTERFACE_LIBRARIES
) részévé.
A könyvtárfüggőségi gráf általában aciklikus (DAG), de az egymástól függő STATIC
könyvtárak esetében a CMake lehetővé teszi, hogy a gráf tartalmazzon ciklusokat (erősen összefüggő komponenseket). Amikor egy másik célpont az egyik könyvtárhoz kapcsolódik, a CMake megismétli a teljes összefüggő komponenst.Például a
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)
kód main
a A B A B
könyvtárhoz kapcsolódik. Míg egy ismétlés általában elégséges, a patológiás objektumfájlok és szimbólumelrendezések több ismétlést is igényelhetnek. Az ilyen eseteket úgy lehet kezelni, hogy az utolsó target_link_libraries
hívásban manuálisan megismételjük a komponenst. Ha azonban két archívum valóban ennyire függ egymástól, akkor valószínűleg egyetlen archívumba kell őket egyesíteni.
A target_link_libraries-hez tartozó argumentumok használhatnak “generátor kifejezéseket” a $<...>
szintaxissal. Megjegyzendő azonban, hogy a generátor kifejezések nem használhatók az OLD CMP0003
vagy CMP0004
kezelésében.A rendelkezésre álló kifejezéseket lásd a cmake-generator-expressions(7)
kézikönyvben. Az építési rendszer tulajdonságainak meghatározásáról bővebben a cmake-buildsystem(7)
kézikönyvben olvashat.
Vélemény, hozzászólás?