target_link_libraries
- Обзор
- Библиотеки для целевого объекта и/или его зависимостей
- Библиотеки для целевого объекта и его зависимостей
- Библиотеки для целевого объекта и/или его зависимостей (устаревшая форма)
- Библиотеки только для зависимостей (устаревшая форма)
- Циклические зависимости статических библиотек
- Создание переносимых пакетов
Укажите библиотеки или флаги, которые следует использовать при линковке данного целевого объекта и/или его зависимостей. Требования к использованию (usage requirements) из связанных целевых библиотек будут проpropagated. Требования к использованию зависимостей целевого объекта влияют на компиляцию его собственных исходных кодов.
Обзор
Эта команда имеет несколько синтаксических вариантов, как подробно описано в следующих подразделах. Все они имеют общий вид:
target_link_libraries(<target> ... <item>... ...)
Названный <target> должен быть создан в текущем каталоге с помощью команды, такой как add_executable() или add_library(). Повторные вызовы для одного и того же <target> добавляют элементы в порядке вызова. Каждый <item> может быть:
-
Имя целевой библиотеки: Сгенерированная строка линковки будет содержать полный путь к файлу линковаемой библиотеки, связанной с целевым объектом. Системa сборки будет иметь зависимость от повторной линковки
<target>в случае изменения файла библиотеки.Названный целевой объект должен быть создан с помощью
add_library()в проекте или как импортированная библиотека. Если он создается в проекте, в системе сборки автоматически добавляется зависимость, чтобы убедиться, что названный целевой объект библиотеки обновлён перед тем, как<target>выполнить линковку.Если у импортированной библиотеки установлено свойство целевого объекта
IMPORTED_NO_SONAME, CMake может попросить компоновщик искать библиотеку вместо использования полного пути (например,/usr/lib/libfoo.soстановится-lfoo). -
Полный путь к файлу библиотеки: Сгенерированная строка линковки обычно сохраняет полный путь к файлу. Система сборки будет иметь зависимость от повторной линковки
<target>в случае изменения файла библиотеки.Существуют случаи, когда CMake может попросить компоновщик искать библиотеку (например,
/usr/lib/libfoo.soстановится-lfoo), например, когда обнаружено, что у разделяемой библиотеки нет поляSONAME. См. политикуCMP0060для обсуждения другого случая.Если файл библиотеки находится в фреймворке Mac OSX, директория
Headersфреймворка также будет обработана как требование к использованию требование к использованию. Это эквивалентно передаче директории фреймворка как директории заголовочных файлов. -
Простое имя библиотеки: Сгенерированная строка линковки попросит компоновщик искать библиотеку (например,
fooстановится-lfooилиfoo.lib). -
Флаг линковки: Имена элементов, начинающиеся с
-, но не с-lили-framework, обрабатываются как флаги компоновщика. Обратите внимание, что такие флаги будут обрабатываться как любой другой элемент линковки библиотек для целей транзитивных зависимостей, поэтому их обычно безопасно указывать только как частные элементы линковки, которые не будут распространяться на зависимые объекты. - Ключевое слово
debug,optimized, илиgeneral, непосредственно за которым следует другой<item>. Элемент, следующий за таким ключевым словом, будет использоваться только для соответствующей конфигурации сборки. Ключевое словоdebugсоответствует конфигурацииDebug(или конфигурациям, указанным вDEBUG_CONFIGURATIONSглобальном свойстве, если оно задано). Ключевое словоoptimizedсоответствует всем остальным конфигурациям. Ключевое словоgeneralсоответствует всем конфигурациям и является чисто необязательным. Более подробные правила для каждой конфигурации могут быть достигнуты путем создания и линковки к импортированным целевым объектам библиотек.
Элементы, содержащие ::, например Foo::Bar, предполагаются как импортированные или псевдонимные целевые объекты библиотек, и приведут к ошибке, если такой целевой объект не существует. См. политику CMP0028.
Аргументы для target_link_libraries могут использовать «генераторские выражения» с синтаксисом $<...>. Однако следует учитывать, что генераторские выражения не будут использоваться в старом обработчике CMP0003 или CMP0004. См. руководство cmake-generator-expressions(7) для доступных выражений. См. руководство cmake-buildsystem(7) для более подробной информации о определении свойств системы сборки.
Библиотеки для целевого объекта и/или его зависимостей
target_link_libraries(<target>
<PRIVATE|PUBLIC|INTERFACE> <item>...
[<PRIVATE|PUBLIC|INTERFACE> <item>...]...)
Ключевые слова PUBLIC, PRIVATE и INTERFACE могут быть использованы для указания как зависимостей линковки, так и интерфейса линковки в одной команде. Библиотеки и целевые объекты, следующие за PUBLIC, подключаются и становятся частью интерфейса линковки. Библиотеки и целевые объекты, следующие за PRIVATE, подключаются, но не входят в состав интерфейса линковки. Библиотеки, следующие за INTERFACE, добавляются в интерфейс линковки и не используются для линковки <target>.
Библиотеки для целевого объекта и его зависимостей
target_link_libraries(<target> <item>...)
Зависимости библиотек по умолчанию являются транзитивными с помощью этого синтаксиса. Когда этот целевой объект подключается к другому целевому объекту, библиотеки, подключенные к этому целевому объекту, также будут отображаться в строке линковки другого целевого объекта. Этот транзитивный «интерфейс линковки» хранится в свойстве целевого объекта INTERFACE_LINK_LIBRARIES и может быть переопределён путём непосредственного задания свойства. Когда CMP0022 не установлено в значение NEW, транзитивная линковка встроена, но может быть переопределена свойством LINK_INTERFACE_LIBRARIES.
Библиотеки для целевого объекта и/или его зависимостей (устаревшая форма)
target_link_libraries(<target>
<LINK_PRIVATE|LINK_PUBLIC> <lib>...
[<LINK_PRIVATE|LINK_PUBLIC> <lib>...]...)
Режимы LINK_PUBLIC и LINK_PRIVATE могут использоваться для указания как зависимостей линковки, так и интерфейса линковки в одной команде.
Этот синтаксис предназначен только для совместимости. Вместо него предпочтительнее использовать ключевые слова PUBLIC или PRIVATE.
Библиотеки и целевые объекты, следующие за LINK_PUBLIC, подключаются и становятся частью INTERFACE_LINK_LIBRARIES. Если политика CMP0022 не NEW, они также становятся частью LINK_INTERFACE_LIBRARIES. Библиотеки и целевые объекты, следующие за LINK_PRIVATE, подключаются, но не входят в INTERFACE_LINK_LIBRARIES (или LINK_INTERFACE_LIBRARIES).
Библиотеки только для зависимостей (устаревшая форма)
target_link_libraries(<target> LINK_INTERFACE_LIBRARIES <item>...)
Режим LINK_INTERFACE_LIBRARIES добавляет библиотеки в свойство целевого объекта INTERFACE_LINK_LIBRARIES вместо их использования для линковки. Если политика CMP0022 не NEW, то в этом режиме библиотеки также добавляются в LINK_INTERFACE_LIBRARIES и его эквивалент для каждой конфигурации.
Данная подпись предназначена только для совместимости. Предпочтительнее использовать режим INTERFACE.
Библиотеки, указанные как debug, обернуты в выражение генератора для соответствия отладочным сборкам. Если политика CMP0022 не NEW, библиотеки также добавляются к свойству LINK_INTERFACE_LIBRARIES_DEBUG (или к свойствам, соответствующим конфигурациям, указанным в глобальном свойстве DEBUG_CONFIGURATIONS, если оно задано). Библиотеки, указанные как optimized, добавляются к свойству INTERFACE_LINK_LIBRARIES. Если политика CMP0022 не NEW, они также добавляются к свойству LINK_INTERFACE_LIBRARIES. Библиотеки, указанные как general (или без какого-либо ключевого слова), обрабатываются так, как если бы они были указаны как для debug , так и для optimized.
Циклические зависимости статических библиотек
Граф зависимостей библиотек обычно является ациклическим (DAG), но в случае взаимозависимых STATIC библиотек CMake разрешает наличие циклов (сильно связных компонент). Когда другой целевой объект подключается к одной из библиотек, CMake повторяет всю соединённую компоненту. Например, код
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 с A B A B. Хотя одного повторения обычно достаточно, патологические расположения объектных файлов и символов могут потребовать большего. Можно обрабатывать такие случаи, используя свойство целевого объекта LINK_INTERFACE_MULTIPLICITY или вручную повторяя компоненту в последнем вызове target_link_libraries. Однако, если две архивы действительно так взаимозависимы, их, вероятно, следует объединить в один архив, возможно, используя Объектные библиотеки.
Создание переносимых пакетов
Обратите внимание, что не рекомендуется заполнять INTERFACE_LINK_LIBRARIES целевого объекта абсолютными путями к зависимостям. Это закрепит в установленных пакетах пути к файлам библиотек зависимостей в соответствии с машиной, на которой пакет был создан.
См. раздел Создание переносимых пакетов руководства cmake-packages(7) для обсуждения дополнительных мер предосторожности, которые необходимо предпринять при указании требований к использованию при создании пакетов для распространения.
© 2000–2019 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.5/command/target_link_libraries.html