Verknüpfen Sie ein Target mit gegebenen Bibliotheken.
target_link_libraries(<target> ]] <item>] ...)
Spezifizieren Sie Bibliotheken oder Flags, die beim Verknüpfen eines gegebenen Targets verwendet werden. Thenamed <target>
muss im aktuellen Verzeichnis durch einen Befehl wie add_executable()
oder add_library()
erstellt worden sein. Die übrigen Argumente geben Bibliotheksnamen oder Flags an. Wiederholte Aufrufe desselben <target>
fügen Elemente in der aufgerufenen Reihenfolge an.
Wenn ein Bibliotheksname mit dem eines anderen Ziels im Projekt übereinstimmt, wird im Build-System automatisch eine Abhängigkeit hinzugefügt, um sicherzustellen, dass die zu verknüpfende Bibliothek aktuell ist, bevor das Ziel verknüpft wird. Elementnamen, die mit -
beginnen, aber nicht -l
oder -framework
, werden als Linker-Flags behandelt.
Ein debug
-, optimized
– oder general
-Schlüsselwort zeigt an, dass die unmittelbar folgende Bibliothek nur für die entsprechende Build-Konfiguration verwendet werden soll. Das Schlüsselwort debug
entspricht der Debug-Konfiguration (oder den Konfigurationen, die in der globalen EigenschaftDEBUG_CONFIGURATIONS
genannt werden, wenn diese gesetzt ist). Das Schlüsselwortoptimized
entspricht allen anderen Konfigurationen. Das Schlüsselwortgeneral
bezieht sich auf alle Konfigurationen und ist rein optional (wird angenommen, wenn es weggelassen wird). Eine höhere Granularität kann für Regeln pro Konfiguration erreicht werden, indem manIMPORTED -Bibliotheksziele erstellt und mit ihnen verlinkt.
Bibliotheksabhängigkeiten sind bei dieser Signatur standardmäßig transitiv.Wenn dieses Ziel mit einem anderen Ziel verlinkt wird, erscheinen die mit diesem Ziel verknüpften Bibliotheken auch in der Linkzeile des anderen Ziels. Diese transitive „Link-Schnittstelle“ ist in derINTERFACE_LINK_LIBRARIES
Targeteigenschaft gespeichert und kann durch direktes Setzen der Eigenschaft außer Kraft gesetzt werden. Wenn CMP0022
nicht aufNEW
gesetzt ist, ist die transitive Verknüpfung eingebaut, kann aber durch die EigenschaftLINK_INTERFACE_LIBRARIES
außer Kraft gesetzt werden. Aufrufe anderer Signaturen dieses Befehls können die Eigenschaft setzen, die alle Bibliotheken, die ausschließlich von dieser Signatur gelinkt werden, privat macht.
CMake überträgt auch die Nutzungsanforderungen von gelinkten Bibliothekszielen. Verwendungsanforderungen von Abhängigkeiten wirken sich auf die Kompilierung von Quellen im <target>
aus.
Wenn ein <item>
eine Bibliothek in einem Mac OX-Framework ist, wird das Headers
Verzeichnis des Frameworks ebenfalls als Verwendungsanforderung verarbeitet. Dies hat den gleichen Effekt wie die Übergabe des Framework-Verzeichnisses als Include-Verzeichnis.
target_link_libraries(<target> <PRIVATE|PUBLIC|INTERFACE> <lib> ... ...])
Die Schlüsselwörter PUBLIC
, PRIVATE
und INTERFACE
können verwendet werden, um sowohl die Link-Abhängigkeiten als auch die Link-Schnittstelle in einem Befehl zu spezifizieren.Bibliotheken und Ziele, die auf PUBLIC
folgen, werden gelinkt und sind Teil der Link-Schnittstelle. Bibliotheken und Ziele, die auf PRIVATE
folgen, werden verlinkt, sind aber nicht Teil der Linkschnittstelle. Bibliotheken, die auf INTERFACE
folgen, werden an die Link-Schnittstelle angehängt und werden nicht zum Linken verwendet.
target_link_libraries(<target> LINK_INTERFACE_LIBRARIES <lib>] ...)
Der Modus LINK_INTERFACE_LIBRARIES
hängt die Bibliotheken an die Zieleigenschaft INTERFACE_LINK_LIBRARIES
an, anstatt sie zum Linken zu verwenden. Wenn die Richtlinie CMP0022
nicht NEW
ist, dann fügt dieser Modus ebenfalls Bibliotheken an die LINK_INTERFACE_LIBRARIES
und ihre Per-Konfiguration an.
Diese Signatur dient nur der Kompatibilität. Bevorzugen Sie stattdessen den Modus INTERFACE
.
Bibliotheken, die als debug
angegeben sind, werden in einen Generator-Ausdruck verpackt, um Debug-Builds zu entsprechen. Wenn die Richtlinie CMP0022
nicht NEW
ist, werden die Bibliotheken auch an die EigenschaftLINK_INTERFACE_LIBRARIES_DEBUG
angehängt (oder an die Eigenschaften, die den in der globalen Eigenschaft DEBUG_CONFIGURATIONS
aufgelisteten Konfigurationen entsprechen, wenn diese festgelegt ist).Die als optimized
angegebenen Bibliotheken werden an die EigenschaftINTERFACE_LINK_LIBRARIES
angehängt. Wenn die Richtlinie CMP0022
nicht NEW
ist, werden sie auch an die Eigenschaft LINK_INTERFACE_LIBRARIES
angehängt. Bibliotheken, die alsgeneral
(oder ohne Schlüsselwort) angegeben sind, werden so behandelt, als wären sie sowohl fürdebug
als auch für optimized
angegeben.
target_link_libraries(<target> <LINK_PRIVATE|LINK_PUBLIC> <lib>] ... <lib>] ...])
Die Modi LINK_PUBLIC
und LINK_PRIVATE
können verwendet werden, um sowohl die Link-Abhängigkeiten als auch die Link-Schnittstelle in einem Befehl anzugeben.
Diese Signatur dient nur der Kompatibilität. Bevorzugen Sie stattdessen die Schlüsselwörter PUBLIC
oderPRIVATE
.
Bibliotheken und Ziele, die auf LINK_PUBLIC
folgen, werden gelinkt und sind Teil von INTERFACE_LINK_LIBRARIES
. Wenn policyCMP0022
nicht NEW
ist, werden sie auch Teil von LINK_INTERFACE_LIBRARIES
. Bibliotheken und Ziele, die aufLINK_PRIVATE
folgen, werden verlinkt, aber nicht Teil vonINTERFACE_LINK_LIBRARIES
(oder LINK_INTERFACE_LIBRARIES
).
Der Bibliotheks-Abhängigkeitsgraph ist normalerweise azyklisch (ein DAG), aber im Fall von gegenseitig abhängigen STATIC
Bibliotheken erlaubt CMake dem Graphen, Zyklen zu enthalten (stark verbundene Komponenten). Wenn ein anderes Ziel auf eine der Bibliotheken verlinkt, wiederholt CMake die gesamte verbundene Komponente. Zum Beispiel verlinkt der 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)
main
auf A B A B
. Während eine Wiederholung in der Regel ausreicht, können pathologische Objektdateien und Symbolanordnungen mehr erfordern. In solchen Fällen kann man die Komponente im letzten target_link_libraries
-Aufruf manuell wiederholen. Wenn jedoch zwei Archive wirklich so voneinander abhängig sind, sollten sie wahrscheinlich zu einem einzigen Archiv zusammengefasst werden.
Argumente für target_link_libraries können „Generatorausdrücke“ mit der Syntax $<...>
verwenden. Beachten Sie jedoch, dass Generatorausdrücke nicht in der OLD-Behandlung von CMP0003
oder CMP0004
verwendet werden.cmake-generator-expressions(7)
Siehe das cmake-generator-expressions(7)
-Handbuch für verfügbare Ausdrücke. Siehe das cmake-buildsystem(7)
-Handbuch für weitere Informationen zum Definieren von Buildsystem-Eigenschaften.
Schreibe einen Kommentar