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 HeadersVerzeichnis 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.