target_link_libraries
- Обзор
- Библиотеки для целевого объекта и/или его зависимостей
- Библиотеки как для целевого объекта, так и для его зависимостей
- Библиотеки для целевого объекта и/или его зависимостей (устаревший вариант)
- Библиотеки только для зависимостей (устаревший вариант)
- Циклические зависимости статических библиотек
- Создание переносимых пакетов
Укажите библиотеки или флаги, которые нужно использовать при линковке данного целевого объекта и/или его зависимостей. Требования к использованию (Usage requirements) связанных целевых библиотек будут проигнорированы. Требования к использованию зависимостей целевого объекта влияют на компиляцию его собственных исходных кодов.
Обзор
Данная команда имеет несколько подписей, как подробно описано в подразделах ниже. Все они имеют общий вид:
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фреймворка также будет обработан как требование к использованию использования. Это имеет тот же эффект, что и передача каталога фреймворка как каталога включения.В генераторах Visual Studio для VS 2010 и выше, файлы библиотек, заканчивающиеся на
.targets, будут обрабатываться как файлы целевых объектов MSBuild и импортированы в сгенерированные файлы проекта. Это не поддерживается другими генераторами. -
Простое имя библиотеки: Сгенерированная команда линковки попросит компоновщик найти библиотеку (например,
fooстановится-lfooилиfoo.lib). -
Флаг линковки: Имена элементов, начинающиеся с
-, но не-lили-framework, обрабатываются как флаги компоновщика. Обратите внимание, что такие флаги будут обрабатываться как любой другой элемент линковки библиотек для целей транзитивных зависимостей, поэтому их обычно безопасно указывать только как частные элементы линковки, которые не будут распространяться на зависимые объекты.Указанные здесь флаги линковки вставляются в команду линковки в том же месте, что и библиотеки линковки. Это может быть неверно в зависимости от компоновщика. Используйте свойство целевого объекта
LINK_FLAGS, чтобы явно добавить флаги линковки. Флаги затем будут размещены в определённом инструментарием месте флагов в команде линковки. - Ключевое слово
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).
Библиотеки только для зависимых (Legacy)
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.11/command/target_link_libraries.html