add_library
- Библиотеки по умолчанию
- Импортированные библиотеки
- Библиотеки объектов
- Библиотеки псевдонимов
- Библиотеки интерфейсов
Добавление библиотеки в проект с использованием указанных исходных файлов.
Библиотеки по умолчанию
add_library(<name> [STATIC | SHARED | MODULE]
[EXCLUDE_FROM_ALL]
[source1] [source2 ...])
Добавляет целевую библиотеку, названную <name> для построения из исходных файлов, перечисленных в вызове команды. (Исходные файлы можно опустить, если они будут добавлены позже с помощью target_sources().) Имя <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 или STATIC могут быть помечены свойством FRAMEWORK для создания фреймворка OS X.
Если библиотека не экспортирует какие-либо символы, её нельзя объявлять как библиотеку SHARED. Например, DLL ресурсов Windows или DLL управляемого C++/CLI, не экспортирующая необработанные символы, должна быть библиотекой 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) для получения дополнительной информации об определении свойств системы сборки.
См. также HEADER_FILE_ONLY о том, что делать, если некоторые исходные файлы предварительно обрабатываются, и вы хотите получить доступ к исходным файлам из среды IDE.
Импортированные библиотеки
add_library(<name> <SHARED|STATIC|MODULE|OBJECT|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. Библиотеки объектов не могут быть компонованы. Некоторые системы нативной сборки (например, Xcode) могут не поддерживать цели, содержащие только объектные файлы, поэтому добавьте, по крайней мере, один реальный исходный файл в любую цель, которая ссылается на $<TARGET_OBJECTS:objlib>.
Библиотеки псевдонимов
add_library(<name> ALIAS <target>)
Создаёт цель-псевдоним, так что <name> может использоваться для ссылки на <target> в последующих командах. Цель-псевдоним <name> не появляется в сгенерированной системе сборки в качестве цели make. Цель-псевдоним <target> не может быть не-GLOBAL импортированной целью или ALIAS. Цели-псевдонимы могут использоваться как компонуемые цели и как цели для чтения свойств. Они также могут проверяться на существование с помощью обычной команды if(TARGET). Цель-псевдоним <name> не может использоваться для изменения свойств <target>, то есть она не может использоваться в качестве операнда команд set_property(), set_target_properties(), target_link_libraries() и т. д. Цель-псевдоним ALIAS не может быть установлена или экспортирована.
Библиотеки интерфейсов
add_library(<name> INTERFACE [IMPORTED [GLOBAL]])
Создаёт библиотеку интерфейса. Цель библиотеки интерфейса INTERFACE напрямую не создаёт выходные данные сборки, хотя на ней могут быть установлены свойства, она может быть установлена, экспортирована и импортирована. Обычно свойства 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.11/command/add_library.html