add_library
- Библиотеки по умолчанию
- Импортированные библиотеки
- Библиотеки объектов
- Псевдонимы библиотек
- Библиотеки интерфейсов
Добавляет библиотеку в проект, используя указанные исходные файлы.
Библиотеки по умолчанию
add_library(<name> [STATIC | SHARED | MODULE]
[EXCLUDE_FROM_ALL]
source1 [source2 ...])
Добавляет целевой объект библиотеки, называемый <name>, для построения из исходных файлов, перечисленных в вызове команды. <name> соответствует логическому имени целевого объекта и должно быть уникальным в рамках проекта. Фактическое имя создаваемой библиотеки строится на основе конвенций родной платформы (например, lib<name>.a или <name>.lib).
STATIC, SHARED, или MODULE могут быть заданы для указания типа создаваемой библиотеки. Библиотеки типа STATIC — это архивы объектных файлов, используемые при компоновке других целевых объектов. Библиотеки типа SHARED подключаются динамически и загружаются во время выполнения. Библиотеки типа MODULE — это плагины, которые не подключаются к другим целевым объектам, но могут загружаться динамически во время выполнения с помощью функции типа dlopen. Если тип не задан явно, тип устанавливается как STATIC или SHARED в зависимости от значения переменной BUILD_SHARED_LIBS, которое равно ON. Для библиотек типа SHARED и MODULE свойство целевого объекта POSITION_INDEPENDENT_CODE автоматически устанавливается в ON. Библиотека типа SHARED может быть помечена свойством целевого объекта FRAMEWORK для создания фреймворка OS X.
Если библиотека не экспортирует какие-либо символы, она не должна объявляться как библиотека типа SHARED. Например, Windows DLL с ресурсами или управляемая 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 для получения подробной информации.
Аргументы исходных файлов для add_library могут использовать «генераторские выражения» со синтаксисом $<...>. См. руководство cmake-generator-expressions(7) для доступных выражений. См. руководство cmake-buildsystem(7) для получения более подробной информации об определении свойств системы сборки.
Импортированные библиотеки
add_library(<name> <SHARED|STATIC|MODULE|UNKNOWN> IMPORTED
[GLOBAL])
Целевой объект импортированной библиотеки ссылается на файл библиотеки, расположенный вне проекта. Правила для его построения не генерируются, и свойство целевого объекта IMPORTED имеет значение True. Имя целевого объекта имеет область действия в каталоге, где он был создан, и ниже, но опция GLOBAL расширяет видимость. Он может быть использован как любой целевой объект, созданный внутри проекта. Библиотеки типа IMPORTED удобны для удобного использования в командах, таких как target_link_libraries(). Подробности об импортированной библиотеке задаются с помощью свойств, имена которых начинаются с IMPORTED_ и INTERFACE_. Наиболее важным таким свойством является IMPORTED_LOCATION (и его вариант для конфигурации IMPORTED_LOCATION_<CONFIG>), который определяет расположение основного файла библиотеки на диске. Смотрите документацию свойств IMPORTED_* и INTERFACE_* для получения дополнительной информации.
Библиотеки объектов
add_library(<name> OBJECT <src>...)
Создает Библиотеку объектов. Библиотека объектов компилирует исходные файлы, но не архивирует и не компонует их объектные файлы в библиотеку. Вместо этого другие целевые объекты, созданные с помощью 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. Библиотеки объектов не могут быть импортированы, экспортированы, установлены или подключены. Некоторые родные системы сборки могут не поддерживать целевые объекты, состоящие только из объектных файлов, поэтому рассмотрите возможность добавления хотя бы одного реального исходного файла в любой целевой объект, ссылающийся на $<TARGET_OBJECTS:objlib>.
Псевдонимы библиотек
add_library(<name> ALIAS <target>)
Создаёт Псевдоним целевого объекта, чтобы <name> мог использоваться для ссылки на <target> в последующих командах. Псевдоним <name> не появляется в генерируемой системе сборки как целевой объект make. Псевдоним <target> не может быть импортированным целевым объектом или ALIAS . Псевдоним целевого объекта можно использовать в качестве компонуемых целевых объектов и как целевые объекты для чтения свойств. Их также можно проверить на существование с помощью обычной подкоманды if(TARGET). Псевдоним <name> не может быть использован для изменения свойств <target>, то есть он не может использоваться в качестве операнда для set_property(), set_target_properties(), target_link_libraries() и т. д. Псевдоним целевого объекта не может быть установлен или экспортирован.
Библиотеки интерфейсов
add_library(<name> INTERFACE [IMPORTED [GLOBAL]])
Создаёт Библиотеку интерфейса. Целевой объект библиотеки интерфейса напрямую не создаёт выходные данные сборки, хотя на него могут быть установлены свойства, и он может быть установлен, экспортирован и импортирован. Обычно свойства INTERFACE_* заполняются для целевого объекта интерфейса с помощью команд:
-
set_property(), -
target_link_libraries(INTERFACE), -
target_include_directories(INTERFACE), -
target_compile_options(INTERFACE), -
target_compile_definitions(INTERFACE), и -
target_sources(INTERFACE),
а затем используется в качестве аргумента для target_link_libraries() как любой другой целевой объект.
Также может быть создан INTERFACE Импортируемый целевой объект с такой подписью. IMPORTED целевой объект библиотеки ссылается на библиотеку, определённую вне проекта. Имя целевого объекта имеет область действия в каталоге, в котором он создан, и ниже, но GLOBAL опция расширяет видимость. К нему можно обратиться как к любому целевому объекту, построенному внутри проекта. IMPORTED библиотеки полезны для удобной ссылки из команд, таких как target_link_libraries().
© 2000–2019 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.5/command/add_library.html