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фреймворка также будет обработана как требование к использованию. Это имеет тот же эффект, что и передача директории фреймворка как директории включения.В генераторах 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.10/command/target_link_libraries.html