Spec-Zone.ru › CMake 3.9

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).

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

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

Spec-Zone.ru

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