Spec-Zone.ru › CMake 3.26

add_library

  • Библиотеки обычного типа
  • Библиотеки объектов
  • Библиотеки интерфейсов
  • Импортированные библиотеки
  • Псевдонимы библиотек
  • См. также

Добавляет библиотеку в проект, используя указанные исходные файлы.

Библиотеки обычного типа

add_library(<name> [STATIC | SHARED | MODULE]
            [EXCLUDE_FROM_ALL]
            [<source>...])

Добавляет целевой объект библиотеки, называемый <name>, для построения из исходных файлов, перечисленных в вызове команды. <name> соответствует логическому имени целевого объекта и должно быть уникальным в рамках проекта. Фактическое имя созданной библиотеки формируется на основе конвенций для конкретной платформы (например, lib<name>.a или <name>.lib).

Новая в версии 3.1: Аргументы исходных файлов для add_library могут использовать «генераторские выражения» с синтаксисом $<...>. См. руководство cmake-generator-expressions(7) для доступных выражений.

Новая в версии 3.11: Исходные файлы можно опустить, если они будут добавлены позже с помощью команды target_sources().

STATIC, SHARED, или MODULE могут использоваться для задания типа создаваемой библиотеки. Библиотеки типа STATIC — это архивы объектных файлов, используемые при компоновке других целевых объектов. Библиотеки типа SHARED подключаются динамически и загружаются во время выполнения. Библиотеки типа MODULE — это плагины, которые не подключаются к другим целевым объектам, но могут загружаться динамически во время выполнения с использованием функций типа dlopen. Если тип не указан явно, тип определяется как STATIC или SHARED в зависимости от значения переменной BUILD_SHARED_LIBS (равно ON). Для библиотек типа SHARED и MODULE свойство целевого объекта POSITION_INDEPENDENT_CODE устанавливается автоматически в значение ON. Библиотека типа SHARED может быть помечена свойством целевого объекта FRAMEWORK для создания macOS Framework.

Новая в версии 3.8: Библиотека типа STATIC может быть помечена свойством целевого объекта FRAMEWORK для создания статической Framework.

Если библиотека не экспортирует какие-либо символы, она не должна объявляться как библиотека типа SHARED. Например, Windows resource DLL или managed C++/CLI DLL, которые не экспортируют неуправляемые символы, должны быть библиотеками типа MODULE. Это связано с тем, что CMake ожидает, что библиотека типа SHARED всегда будет иметь связанную импортную библиотеку в Windows.

По умолчанию файл библиотеки создается в каталоге сборки, соответствующем каталогу исходных файлов, в котором была выполнена команда. См. документацию по свойствам целевых объектов ARCHIVE_OUTPUT_DIRECTORY, LIBRARY_OUTPUT_DIRECTORY и RUNTIME_OUTPUT_DIRECTORY для изменения этого расположения. См. документацию по свойству целевого объекта OUTPUT_NAME для изменения части имени конечного файла <name>.

Если задано EXCLUDE_FROM_ALL, соответствующее свойство будет установлено для созданного целевого объекта. См. документацию по свойству целевого объекта EXCLUDE_FROM_ALL для получения дополнительной информации.

См. руководство cmake-buildsystem(7) для получения дополнительной информации об определении свойств системы сборки.

См. также HEADER_FILE_ONLY для получения информации о том, что делать, если некоторые исходные файлы предварительно обрабатываются, и вам необходимо сохранить доступ к исходным файлам в IDE.

Библиотеки объектов

add_library(<name> OBJECT [<source>...])

Создаёт библиотеку объектов. Библиотека объектов компилирует исходные файлы, но не архивирует и не компонует их объектные файлы в библиотеку. Вместо этого другие целевые объекты, созданные с помощью add_library или add_executable(), могут ссылаться на объекты, используя выражение вида $<TARGET_OBJECTS:objlib> в качестве источника, где objlib — имя библиотеки объектов. Например:

add_library(... $<TARGET_OBJECTS:objlib> ...)
add_executable(... $<TARGET_OBJECTS:objlib> ...)

включает объектные файлы objlib в библиотеку и исполняемый файл вместе с объектами, скомпилированными из их собственных исходных файлов. Библиотеки объектов могут содержать только компилируемые исходные файлы, заголовочные файлы и другие файлы, которые не влияют на компоновку обычной библиотеки (например, .txt). Они могут содержать пользовательские команды, генерирующие такие исходные файлы, но не команды PRE_BUILD, PRE_LINK, или POST_BUILD. Некоторые системы сборки (например, Xcode) могут не поддерживать целевые объекты, содержащие только объектные файлы, поэтому рекомендуется добавить по крайней мере один реальный исходный файл в любой целевой объект, который ссылается на $<TARGET_OBJECTS:objlib>.

Новая в версии 3.12: Библиотеки объектов можно подключать с помощью команды target_link_libraries().

Библиотеки интерфейсов

add_library(<name> INTERFACE)

Создаёт библиотеку интерфейса. Целевой объект библиотеки интерфейса не компилирует исходные файлы и не создаёт библиотечный файл на диске. Однако на нём можно установить свойства и выполнить установку и экспорт. Обычно свойства INTERFACE устанавливаются на целевой объект интерфейса с помощью команд:

  • set_property(),
  • target_link_libraries(INTERFACE),
  • target_link_options(INTERFACE),
  • target_include_directories(INTERFACE),
  • target_compile_options(INTERFACE),
  • target_compile_definitions(INTERFACE), и
  • target_sources(INTERFACE),

а затем используется как аргумент для target_link_libraries() как любой другой целевой объект.

Библиотека интерфейса, созданная с указанными выше параметрами, не имеет собственных исходных файлов и не включается в качестве целевого объекта в сгенерированную систему сборки.

Новая в версии 3.15: Библиотека интерфейса может иметь свойства PUBLIC_HEADER и PRIVATE_HEADER. Заголовочные файлы, указанные в этих свойствах, могут быть установлены с помощью команды install(TARGETS).

Новое в версии 3.19: Библиотека интерфейсов может быть создана с исходными файлами:

add_library(<name> INTERFACE [<source>...] [EXCLUDE_FROM_ALL])

Исходные файлы могут быть перечислены непосредственно в вызове add_library или добавлены позже с помощью вызовов target_sources() с ключевыми словами PRIVATE или PUBLIC.

Если у библиотеки интерфейсов есть исходные файлы (т.е. свойство целевого объекта SOURCES установлено) или наборы заголовков (т.е. свойство целевого объекта HEADER_SETS установлено), она будет отображаться в сгенерированной системе сборки как целевой объект, аналогично объекту, определённому командой add_custom_target(). Она не компилирует никакие исходные файлы, но содержит правила сборки для пользовательских команд, созданных командой add_custom_command().

Примечание

В большинстве подписей команд, где появляется ключевое слово INTERFACE, элементы, указанные после него, являются лишь частью требований к использованию этой цели, а не частью её собственных настроек. Однако в данной подписи add_library, ключевое слово INTERFACE относится только к типу библиотеки. Исходные файлы, указанные после него в вызове add_library, являются PRIVATE для библиотеки интерфейса и не отображаются в её свойстве целевого объекта INTERFACE_SOURCES.

Импортированные библиотеки

add_library(<name> <type> IMPORTED [GLOBAL])

Создаёт целевой объект импортированной библиотеки с именем <name>. Правила для её сборки не генерируются, и свойство целевого объекта IMPORTED установлено в True. Имя объекта имеет область действия в каталоге, в котором он создан, и ниже, но опция GLOBAL расширяет видимость. К нему можно обратиться как к любому целевому объекту, собранному в рамках проекта. IMPORTED библиотеки полезны для удобной ссылки из команд, таких как target_link_libraries(). Подробности о импортированной библиотеке задаются с помощью свойств, имена которых начинаются с IMPORTED_ и INTERFACE_.

<type> должно быть одним из:

STATIC, SHARED, MODULE, UNKNOWN

Ссылка на файл библиотеки, расположенный вне проекта. Свойство целевого объекта IMPORTED_LOCATION (или его вариант для конфигураций IMPORTED_LOCATION_<CONFIG>) задаёт расположение основного файла библиотеки на диске:

  • Для SHARED библиотеки на большинстве платформ, отличных от Windows, основной файл библиотеки — это .so или .dylib файл, используемый как линковщиками, так и динамическими загрузчиками. Если у файла библиотеки есть SONAME (или на macOS есть LC_ID_DYLIB начиная с @rpath/ ), значение этого поля должно быть установлено в свойстве целевого объекта IMPORTED_SONAME. Если у файла библиотеки нет SONAME, но платформа поддерживает это, то свойство целевого объекта IMPORTED_NO_SONAME должно быть установлено.
  • Для SHARED библиотеки на Windows, свойство целевого объекта IMPORTED_IMPLIB (или его вариант для конфигураций IMPORTED_IMPLIB_<CONFIG>) задаёт расположение файла DLL-библиотеки импорта (.lib или .dll.a) на диске, а IMPORTED_LOCATION — расположение .dll библиотеки выполнения (и является необязательным, но необходимым для генераторского выражения TARGET_RUNTIME_DLLS).

Дополнительные требования к использованию могут быть заданы в свойствах INTERFACE_*.

Тип библиотеки UNKNOWN обычно используется только при реализации модулей Нахождения модулей. Он позволяет использовать путь к импортированной библиотеке (часто найденной с помощью команды find_library()) без необходимости знать её тип. Это особенно полезно на Windows, где статическая библиотека и DLL-библиотека импорта имеют один и тот же расширение файла.

OBJECT

Ссылка на набор объектных файлов, расположенных вне проекта. Свойство целевого объекта IMPORTED_OBJECTS (или его вариант для конфигураций IMPORTED_OBJECTS_<CONFIG>) задаёт расположение объектных файлов на диске. Дополнительные требования к использованию могут быть заданы в свойствах INTERFACE_*.

INTERFACE

Не ссылается на никакие библиотеки или объектные файлы на диске, но может задавать требования к использованию в свойствах INTERFACE_*.

См. документацию по свойствам IMPORTED_* и INTERFACE_* для получения дополнительной информации.

Библиотеки псевдонимов

add_library(<name> ALIAS <target>)

Создаёт целевой объект-псевдоним, так что <name> может использоваться для ссылки на <target> в последующих командах. Псевдоним не отображается в сгенерированной системе сборки как целевой объект make. Псевдоним может не быть ALIAS.

Новое в версии 3.11: Псевдоним может ссылаться на импортированный целевой объект

Новое в версии 3.18: Псевдоним может ссылаться на не-GLOBAL импортированный целевой объект. Такой псевдоним имеет область действия в каталоге, в котором он создан, и ниже. Свойство целевого объекта ALIAS_GLOBAL может быть использовано для проверки того, является ли псевдоним глобальным или нет.

Целевые объекты-псевдонимы могут быть использованы в качестве линковаемых целевых объектов и для чтения свойств. Их также можно проверить на существование с помощью стандартной команды if(TARGET). Псевдоним не может использоваться для изменения свойств <target>, то есть он не может использоваться в качестве операнда set_property(), set_target_properties(), target_link_libraries() и т. д. Целевой объект-псевдоним не может быть установлен или экспортирован.

См. также

  • add_executable()

© 2000–2023 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.26/command/add_library.html

Spec-Zone.ru

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