Poł±cz cel z podanymi bibliotekami.
target_link_libraries(<target> ]] <item>] ...)
Zdefiniuj biblioteki lub flagi do użycia podczas linkowania danego celu. Biblioteka o nazwie <target>
musi być utworzona w bieżącym katalogu poleceniem takim jak add_executable()
lub add_library()
. Pozostałe argumenty określają nazwy bibliotek lub flagi. Powtarzające się wywołania tej samej biblioteki <target>
dołączają elementy w kolejności, w jakiej zostały wywołane.
Jeśli nazwa biblioteki pasuje do nazwy innego celu w projekcie, zostanie automatycznie dodana zależność w systemie budowania, aby upewnić się, że łączona biblioteka jest aktualna przed połączeniem celu. Nazwy elementów zaczynające się od -
, ale nie -l
lub -framework
, są traktowane jako flagi łączące.
Słowo kluczowe debug
, optimized
lub general
wskazuje, że biblioteka bezpośrednio po nim następująca ma być używana tylko dla odpowiadającej jej konfiguracji kompilacji. Słowo kluczowe debug
odpowiada konfiguracji Debug (lub konfiguracji nazwanej we właściwości globalnejDEBUG_CONFIGURATIONS
, jeśli jest ona ustawiona). Słowo kluczoweoptimized
odpowiada wszystkim innym konfiguracjom. Słowo kluczowegeneral
odpowiada wszystkim konfiguracjom i jest czysto opcjonalne (zakładane, jeśli zostanie pominięte). Wyższa ziarnistość może być osiągnięta dla regułper-configuration przez tworzenie i łączenie doIMPORTED celów bibliotecznych.
Zależności biblioteczne są domyślnie przechodnie z tą sygnaturą.Kiedy ten cel jest połączony z innym celem, wtedy biblioteki połączone z tym celem pojawią się również w linii łącza dla drugiego celu. Ten przechodni „interfejs łącza” jest przechowywany we właściwościINTERFACE_LINK_LIBRARIES
target i może być nadpisany przez ustawienie właściwości bezpośrednio. Gdy CMP0022
nie jest ustawione naNEW
, wbudowane jest łączenie przechodnie, ale może być nadpisane przez właściwośćLINK_INTERFACE_LIBRARIES
. Wywołania innych sygnatur tego polecenia mogą ustawić właściwość czyniącą prywatne biblioteki połączone wyłącznie przez tę sygnaturę.
CMake będzie także propagować wymagania użycia z połączonych celów bibliotecznych. Wymagania użytkowe zależności wpływają na kompilację źródeł w <target>
.
Jeśli <item>
jest biblioteką we frameworku Mac OX, katalog Headers
tego frameworka będzie również przetwarzany jako wymaganie ausage. Ma to taki sam skutek jak przekazanie katalogu frameworka jako katalogu include.
target_link_libraries(<target> <PRIVATE|PUBLIC|INTERFACE> <lib> ... ...])
Słowa kluczowe PUBLIC
, PRIVATE
i INTERFACE
mogą być użyte do określenia zarówno zależności łącza, jak i interfejsu łącza w jednym poleceniu.Biblioteki i cele następujące po PUBLIC
są łączone z i są częścią interfejsu łącza. Biblioteki i cele następujące po PRIVATE
są połączone z, ale nie są częścią interfejsu łącza. Biblioteki podążające za INTERFACE
są dołączane do interfejsu łącza i nie są używane do łączenia <target>
.
target_link_libraries(<target> LINK_INTERFACE_LIBRARIES <lib>] ...)
Tryb LINK_INTERFACE_LIBRARIES
dołącza biblioteki do właściwościINTERFACE_LINK_LIBRARIES
docelowej zamiast używać ich do łączenia. Jeśli polityka CMP0022
nie jest NEW
, to ten tryb również dołącza biblioteki do właściwości LINK_INTERFACE_LIBRARIES
i jej odpowiednika konfiguracyjnego.
Ta sygnatura jest tylko dla kompatybilności. Preferuj tryb INTERFACE
.
Biblioteki określone jako debug
są zawijane w wyrażenie generatora, aby odpowiadać kompilacjom debug. Jeśli polityka CMP0022
nie jest NEW
, biblioteki są także dołączane do właściwościLINK_INTERFACE_LIBRARIES_DEBUG
(lub do właściwości odpowiadających konfiguracjom wymienionym we właściwości globalnej DEBUG_CONFIGURATIONS
, jeśli jest ona ustawiona).Biblioteki określone jako optimized
są dołączane do właściwościINTERFACE_LINK_LIBRARIES
. Jeśli polityka CMP0022
nie jest NEW
, są one również dołączane do właściwościLINK_INTERFACE_LIBRARIES
. Biblioteki określone jakogeneral
(lub bez żadnego słowa kluczowego) są traktowane tak, jakby były określone zarówno dladebug
, jak i optimized
.
target_link_libraries(<target> <LINK_PRIVATE|LINK_PUBLIC> <lib>] ... <lib>] ...])
Trybów LINK_PUBLIC
i LINK_PRIVATE
można użyć do określenia zarówno zależności łącza, jak i interfejsu łącza w jednym poleceniu.
Ta sygnatura jest tylko dla kompatybilności. Preferuj zamiast niej słowa kluczowe PUBLIC
lubPRIVATE
.
Biblioteki i cele następujące po LINK_PUBLIC
są linkowane i stają się częścią INTERFACE_LINK_LIBRARIES
. Jeśli politykaCMP0022
nie jest NEW
, są one również częściąLINK_INTERFACE_LIBRARIES
. Biblioteki i cele następujące poLINK_PRIVATE
są linkowane, ale nie są częściąINTERFACE_LINK_LIBRARIES
(lub LINK_INTERFACE_LIBRARIES
).
Wykres zależności bibliotek jest normalnie acykliczny (DAG), ale w przypadku wzajemnie zależnych STATIC
bibliotek CMake pozwala, aby wykres zawierał cykle (silnie połączone elementy). Na przykład, kod
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)
łączy main
z A B A B
. Podczas gdy jedno powtórzenie jest zazwyczaj wystarczające, patologiczne układy plików obiektów i symboli mogą wymagać więcej. Można sobie poradzić z takimi przypadkami przez ręczne powtórzenie komponentu w ostatnim wywołaniu target_link_libraries
. Jednakże, jeśli dwa archiwa są naprawdę tak współzależne, to prawdopodobnie powinny być połączone w jedno archiwum.
Argumenty do target_link_libraries mogą używać „wyrażeń generatora” o składni $<...>
. Zauważ jednak, że wyrażenia generatora nie będą używane w OLD do obsługi CMP0003
lub CMP0004
.Zobacz podręcznik cmake-generator-expressions(7)
dla dostępnych wyrażeń. Więcej na temat definiowania właściwości systemu budowania można znaleźć w podręczniku cmake-buildsystem(7)
.
Dodaj komentarz