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 или управляемая 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 о том, что делать, если некоторые исходные файлы предварительно обработаны, и вам необходимо иметь доступ к исходным файлам в среде разработки.
Библиотеки объектов
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() и т.д. Целевой объект-псевдоним не может быть установлен или экспортирован.
© 2000–2022 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.24/command/add_library.html