Spec-Zone.ru › CMake 3.7

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, обрабатываются как флаги компоновщика. Обратите внимание, что такие флаги будут обрабатываться как любые другие элементы компоновки библиотек для целей транзитивных зависимостей, поэтому их обычно безопасно указывать только как частные элементы компоновки, которые не будут распространяться на зависимые объекты.

    Флаги компоновки, указанные здесь, вставляются в команду компоновки в том же месте, что и библиотеки компоновки. Это может быть неверно в зависимости от компоновщика. Используйте свойство целевого объекта 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).

Библиотеки только для зависимостей (устаревшее)

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.7/command/target_link_libraries.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API