Länka ett mål till givna bibliotek.
target_link_libraries(<target> ]] <item>] ...)
Specificera bibliotek eller flaggor som ska användas vid länkning av ett givet mål. Thenamed <target>
måste ha skapats i den aktuella katalogen genom ettkommando som add_executable()
eller add_library()
. De följande argumenten anger biblioteksnamn eller flaggor. Upprepade anrop för samma <target>
lägger till objekt i den ordning som anropas.
Om ett biblioteksnamn matchar namnet på ett annat mål i projektet kommer ett beroende automatiskt att läggas till i byggsystemet för att se till att biblioteket som länkas är uppdaterat innan målet länkas. Objektnamn som börjar med -
, men inte -l
eller -framework
, behandlas som länkflaggor.
Ett debug
, optimized
eller general
nyckelord indikerar att biblioteket som följer omedelbart efter det endast ska användas för den motsvarande byggkonfigurationen. Nyckelordet debug
motsvarar Debug-konfigurationen (eller de konfigurationer som namnges i den globala egenskapen DEBUG_CONFIGURATIONS
om den är inställd). Nyckelordetoptimized
motsvarar alla andra konfigurationer. Nyckelordetgeneral
motsvarar alla konfigurationer och är helt frivilligt (antas om det utelämnas). Högre granularitet kan uppnås för regler per konfiguration genom att skapa och länka tillIMPORTED-biblioteksmål.
Biblioteksberoenden är transitiva som standard med den här signaturen.När det här målet länkas till ett annat mål kommer de bibliotek som är länkade till det här målet också att visas på länkraden för det andra målet. Detta transitiva ”länkgränssnitt” lagras i egenskapenINTERFACE_LINK_LIBRARIES
target och kan åsidosättas genom att ställa in egenskapen direkt. När CMP0022
inte är satt tillNEW
är transitiv länkning inbyggd men kan åsidosättas av egenskapenLINK_INTERFACE_LIBRARIES
. Anrop till andra signaturer av detta kommando kan ställa in egenskapen som gör att alla bibliotek som länkas exklusivt av denna signatur blir privata.
CMake kommer också att propagera användningskrav från länkade biblioteksmål. Användningskrav för beroenden påverkarkompilering av källor i <target>
.
Om ett <item>
är ett bibliotek i ett Mac OX-ramverk kommer Headers
förteckningen i ramverket också att behandlas som ett användningskrav. Detta har samma effekt som att lämna över ramkatalogen som en include-katalog.
target_link_libraries(<target> <PRIVATE|PUBLIC|INTERFACE> <lib> ... ...])
Nyckelorden PUBLIC
, PRIVATE
och INTERFACE
kan användas för att specificera både länkberoenden och länkgränssnittet i ett och samma kommando.Bibliotek och mål som följer på PUBLIC
länkas till och blir en del av länkgränssnittet. Bibliotek och mål som följer PRIVATE
länkas till, men ingår inte i länkgränssnittet. Bibliotek som följer INTERFACE
läggs till länkgränssnittet och används inte för att länka <target>
.
target_link_libraries(<target> LINK_INTERFACE_LIBRARIES <lib>] ...)
Läget LINK_INTERFACE_LIBRARIES
lägger biblioteken till INTERFACE_LINK_LIBRARIES
-målegenskapen i stället för att använda dem för länkning. Om policy CMP0022
inte är NEW
, lägger detta läge också till biblioteken till LINK_INTERFACE_LIBRARIES
och desssper-konfiguration motsvarande.
Denna signatur är endast för kompatibilitet. Använd hellre läget INTERFACE
i stället.
Bibliotek som anges som debug
är omslutna av ett generatoruttryck för att motsvara felsökningsbyggen. Om policy CMP0022
inte är NEW
läggs biblioteken också till egenskapen LINK_INTERFACE_LIBRARIES_DEBUG
(eller till de egenskaper som motsvarar de konfigurationer som anges i den globala egenskapen DEBUG_CONFIGURATIONS
om den är inställd).Bibliotek som anges som optimized
läggs till egenskapen INTERFACE_LINK_LIBRARIES
. Om policy CMP0022
inte är NEW
läggs de också till i egenskapenLINK_INTERFACE_LIBRARIES
. Bibliotek som anges somgeneral
(eller utan nyckelord) behandlas som om de angetts för bådedebug
och optimized
.
target_link_libraries(<target> <LINK_PRIVATE|LINK_PUBLIC> <lib>] ... <lib>] ...])
Lägena LINK_PUBLIC
och LINK_PRIVATE
kan användas för att specificera både länkberoenden och länkgränssnittet i ett och samma kommando.
Den här signaturen är endast för kompatibilitet. Använd hellre nyckelorden PUBLIC
ellerPRIVATE
i stället.
Bibliotek och mål som följer LINK_PUBLIC
länkas till och är en del av INTERFACE_LINK_LIBRARIES
. Om policyCMP0022
inte är NEW
, blir de också en del avLINK_INTERFACE_LIBRARIES
. Bibliotek och mål som följer LINK_PRIVATE
länkas till, men görs inte till en del av INTERFACE_LINK_LIBRARIES
(eller LINK_INTERFACE_LIBRARIES
).
Biblioteksberoendegrafen är normalt acyklisk (en DAG), men när det gäller ömsesidigt beroende STATIC
-bibliotek tillåter CMake att grafen innehåller cykler (starkt sammankopplade komponenter). När ett annat mål länkar till ett av biblioteken upprepar CMake hela den anslutna komponenten, till exempel 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)
länkar main
till A B A B
. Det räcker vanligtvis med en upprepning, men patologiska objektfiler och symbolarrangemang kan kräva fler upprepningar. Man kan hantera sådana fall genom att manuellt upprepa komponenten i det sista target_link_libraries
-anropet. Om två arkiv verkligen är så beroende av varandra bör de dock troligen kombineras till ett enda arkiv.
Argument till target_link_libraries kan använda ”generatoruttryck” med syntaxen $<...>
. Observera dock att generatoruttryck inte kommer att användas vid OLD-hantering av CMP0003
eller CMP0004
.Se cmake-generator-expressions(7)
manualen för tillgängligauttryck. Se cmake-buildsystem(7)
manualen för mer information om hur man definierar byggsystemets egenskaper.
Lämna ett svar