add_library
- Библиотеки обычного типа
- Библиотеки объектов
- Библиотеки интерфейсов
- Импортируемые библиотеки
- Библиотеки псевдонимов
- См. также
Добавляет библиотеку в проект, используя указанные исходные файлы.
Библиотеки обычного типа
-
add_library(<name> [<type>] [EXCLUDE_FROM_ALL] <sources>...) -
Добавляет целевой объект библиотеки, называемый
<name>, который будет построен из исходных файлов, перечисленных в вызове команды.Необязательный параметр
<type>указывает тип создаваемой библиотеки:-
STATIC -
Архив файлов объектов для использования при линковке других целевых объектов.
-
SHARED -
Динамическая библиотека, которая может быть связана с другими целевыми объектами и загружена во время выполнения.
-
MODULE -
Плагин, который не может быть связан с другими целевыми объектами, но может быть динамически загружен во время выполнения с помощью функций типа dlopen.
Если параметр
<type>не указан, по умолчанию используетсяSTATICилиSHARED, в зависимости от значения переменнойBUILD_SHARED_LIBS.Доступные параметры:
-
EXCLUDE_FROM_ALL -
Автоматически устанавливает свойство целевого объекта
EXCLUDE_FROM_ALL. Для получения подробностей см. документацию по этому свойству целевого объекта.
-
<name> соответствует логическому имени целевого объекта и должно быть уникальным в рамках проекта. Фактическое имя файла создаваемой библиотеки формируется на основе конвенций родной платформы (например, lib<name>.a или <name>.lib).
Добавлена в версии 3.1: Аргументы исходных файлов для add_library могут использовать "генераторские выражения" с синтаксисом $<...>. См. руководство по cmake-generator-expressions(7) для доступных выражений.
Добавлена в версии 3.11: Исходные файлы могут быть опущены, если они будут добавлены позже с помощью target_sources().
Для библиотек SHARED и MODULE свойство целевого объекта POSITION_INDEPENDENT_CODE устанавливается в ON автоматически. Библиотека SHARED может быть помечена свойством целевого объекта FRAMEWORK для создания macOS Framework.
Добавлена в версии 3.8: Библиотека STATIC может быть помечена свойством целевого объекта FRAMEWORK для создания статического Framework.
Если библиотека не экспортирует какие-либо символы, она не должна быть объявлена как библиотека SHARED. Например, библиотека ресурсов Windows или управляемая C++/CLI DLL, которая не экспортирует неуправляемые символы, должна быть библиотекой MODULE. Это связано с тем, что CMake ожидает, что библиотека SHARED всегда будет иметь связанную импортируемую библиотеку в Windows.
По умолчанию файл библиотеки будет создан в каталоге дерева сборки, соответствующем каталогу дерева исходного кода, в котором была вызвана команда. Для изменения этого расположения см. документацию по свойствам целевого объекта ARCHIVE_OUTPUT_DIRECTORY, LIBRARY_OUTPUT_DIRECTORY и RUNTIME_OUTPUT_DIRECTORY. Для изменения части имени файла <name> см. документацию по свойству целевого объекта OUTPUT_NAME.
См. руководство cmake-buildsystem(7) для получения дополнительной информации об определении свойств системы сборки.
См. также HEADER_FILE_ONLY о том, что делать, если некоторые исходные файлы предварительно обработаны, и вы хотите иметь доступ к исходным файлам изнутри IDE.
Изменено в версии 3.30: На платформах, которые не поддерживают общие библиотеки, add_library теперь завершается неудачно при вызове создания библиотек SHARED вместо автоматического преобразования их в библиотеки STATIC как раньше. См. политику CMP0164.
Библиотеки объектов
-
add_library(<name> OBJECT <sources>...) -
Добавляет объектную библиотеку для компиляции исходных файлов без архивирования или линковки их файлов объектов в библиотеку.
Другие целевые объекты, созданные с помощью 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). -
-
add_library(<name> INTERFACE [EXCLUDE_FROM_ALL] <sources>...) -
Добавлен в версии 3.19.
Добавить целевой объект Библиотеки интерфейса с исходными файлами (в дополнение к требованиям использования и свойствам, как описано в
above signature). Исходные файлы могут быть перечислены непосредственно в вызовеadd_libraryили добавлены позже вызовамиtarget_sources()с ключевыми словамиPRIVATEилиPUBLIC.Если у библиотеки интерфейса есть исходные файлы (т.е. установлено свойство целевого объекта
SOURCES) или наборы заголовков (т.е. установлено свойство целевого объектаHEADER_SETS), она будет отображаться в сгенерированной системе сборки как целевой объект, подобно объекту, определённому командойadd_custom_target(). Она не компилирует исходники, но содержит правила сборки для пользовательских команд, созданных командойadd_custom_command().Варианты:
-
EXCLUDE_FROM_ALL -
Автоматически устанавливает свойство целевого объекта
EXCLUDE_FROM_ALL. Подробнее см. документацию по этому свойству целевого объекта.
Примечание
В большинстве подписей команд, где появляется ключевое слово
INTERFACE, элементы, указанные после него, становятся только частью требований использования этого целевого объекта, но не частью его собственных настроек. Однако в этой подписиadd_library, ключевое словоINTERFACEотносится только к типу библиотеки. Исходники, указанные после него в вызовеadd_library,PRIVATEбиблиотеке интерфейса и не отображаются в свойстве целевого объектаINTERFACE_SOURCES. -
Импортированные библиотеки
-
add_library(<name> <type> IMPORTED [GLOBAL]) -
Добавить Целевой объект импортированной библиотеки под названием
<name>. Название целевого объекта может быть использовано как любое другое целевой объект, созданный в проекте, за исключением того, что по умолчанию он виден только в каталоге, в котором он создан, и ниже.<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()) без необходимости знать, какой тип библиотеки это. - Для
-
OBJECT -
Ссылка на набор файлов объектов, расположенных вне проекта. Свойство целевого объекта
IMPORTED_OBJECTS(или его вариант для каждой конфигурацииIMPORTED_OBJECTS_<CONFIG>) указывает расположения файлов объектов на диске. Дополнительные требования к использованию могут быть указаны в свойствахINTERFACE_*. -
INTERFACE -
Не ссылается на файлы библиотек или объектов на диске, но может указать требования к использованию в свойствах
INTERFACE_*.
Варианты:
-
GLOBAL -
Сделать имя целевого объекта глобально видимым.
-
Правила для сборки импортированных целевых объектов не генерируются, и свойство целевого объекта IMPORTED равно True. Импортированные библиотеки полезны для удобной ссылки из команд, таких как target_link_libraries().
Подробности о импортированной библиотеке задаются путём установки свойств, имена которых начинаются с IMPORTED_ и INTERFACE_. Для получения дополнительной информации см. документацию по таким свойствам.
Библиотеки псевдонимов
-
add_library(<name> ALIAS <target>) -
Создаёт целевое псевдоним, таким образом,
<name>может быть использован для ссылки на<target>в последующих командах.<name>не отображается в сгенерированной системе сборки как целевая задача make.<target>может не бытьALIAS.
Добавлена в версии 3.11: Целевой псевдоним может ссылаться на импортированную цель ALIAS.
Добавлена в версии 3.18: Целевой псевдоним может ссылаться на импортированную цель, которая не является GLOBAL. Такой псевдоним ограничен директорией, в которой он создан, и ниже. Свойство целевого объекта ALIAS_GLOBAL может быть использовано для проверки, является ли псевдоним глобальным.
Цели ALIAS могут использоваться как связуемые цели и как цели для чтения свойств. Их также можно проверить на существование с помощью стандартной подкоманды if(TARGET). Целевой псевдоним <name> нельзя использовать для изменения свойств <target>, то есть его нельзя использовать в качестве операнда для set_property(), set_target_properties(), target_link_libraries() и т.д. Целевая задача ALIAS не может быть установлена или экспортирована.
См. также
© 2000–2024 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/latest/command/add_library.html