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 ресурсная 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 о том, что делать, если некоторые исходные файлы предварительно обрабатываются, и вам необходимо, чтобы исходные файлы были доступны в среде 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 import библиотеки (.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> в последующих командах. <name> не появляется в сгенерированной системе сборки как целевой объект make. <target> может не быть ALIAS.
Новое в версии 3.11: Псевдоним может указывать на импортированный целевой объект
Новое в версии 3.18: Псевдоним может указывать на не-GLOBAL импортированный целевой объект. Такой псевдоним имеет область видимости в каталоге, в котором он создан, и ниже. Свойство целевого объекта ALIAS_GLOBAL можно использовать для проверки, является ли псевдоним глобальным.
ALIAS целевые объекты могут использоваться как связуемые целевые объекты и как целевые объекты для чтения свойств. Их также можно проверить на существование с помощью обычного подкоманды if(TARGET). <name> не может быть использован для изменения свойств <target>, то есть он не может использоваться в качестве операнда set_property(), set_target_properties(), target_link_libraries() и т.д. Целевой объект-псевдоним не может быть установлен или экспортирован.
См. также
© 2000–2024 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.27/command/add_library.html