target_link_libraries
- Обзор
- Библиотеки для целевого объекта и/или его зависимостей
- Библиотеки для целевого объекта и его зависимостей
- Библиотеки для целевого объекта и/или его зависимостей (устаревшее)
- Библиотеки только для зависимостей (устаревшее)
- Циклические зависимости статических библиотек
- Создание переносимых пакетов
Укажите библиотеки или флаги для использования при компоновке заданного целевого объекта и/или его зависимостей. Требования к использованию из целевых библиотек, на которые ссылается целевой объект, будут распространяться. Требования к использованию зависимостей целевого объекта влияют на компиляцию его собственных исходных кодов.
Обзор
Эта команда имеет несколько подписей, как подробно описано в подразделах ниже. Все они имеют общий вид:
target_link_libraries(<target> ... <item>... ...)
Названный <target> должен быть создан в текущем каталоге командой, такой как add_executable() или add_library(). Повторные вызовы для одного и того же <target> добавляют элементы в порядке вызова. Каждый <item> может быть:
-
Имя целевого объекта библиотеки: Сгенерированная строка компоновки будет содержать полный путь к файлу компонуемой библиотеки, связанному с целевым объектом. Система построения будет иметь зависимость от повторной компоновки
<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.6/command/target_link_libraries.html