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.
Добавлено в версии 3.8: Для библиотеки STATIC можно установить свойство цели FRAMEWORK, чтобы создать статический фреймворк.
Если библиотека не экспортирует символы, её нельзя объявлять как библиотеку SHARED. Например, DLL ресурсов Windows или управляемая DLL C++/CLI, которая не экспортирует неуправляемые символы, должна быть библиотекой MODULE. Это связано с тем, что CMake ожидает, что у библиотеки SHARED в Windows всегда будет соответствующая библиотека импорта.
По умолчанию файл библиотеки создаётся в каталоге дерева сборки, соответствующем каталогу дерева исходных файлов, из которого была вызвана команда. Чтобы изменить это расположение, см. документацию свойств целей ARCHIVE_OUTPUT_DIRECTORY, LIBRARY_OUTPUT_DIRECTORY и RUNTIME_OUTPUT_DIRECTORY. Чтобы изменить часть <name> итогового имени файла, см. документацию свойства цели OUTPUT_NAME.
Дополнительную информацию об определении свойств системы сборки см. в руководстве cmake-buildsystem(7).
О том, что делать с предварительно обработанными исходными файлами, если вы хотите, чтобы оригиналы были доступны в IDE, см. также HEADER_FILE_ONLY.
Изменено в версии 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> INTERFACE SYMBOLIC) -
Добавлено в версии 4.2.
Добавляет символическую цель интерфейсной библиотеки. Символические интерфейсные библиотеки полезны для представления необязательных компонентов или возможностей пакета. У них нет требований использования, они не компилируют исходные файлы и не создают на диске артефакт библиотеки, но их можно экспортировать и устанавливать. Их также можно проверять на существование с помощью стандартной подкоманды
if(TARGET).Символическую интерфейсную библиотеку можно использовать как цель для компоновки, чтобы обеспечить наличие необязательных компонентов зависимости. Например, если библиотека
libguiможет предоставлять или не предоставлять возможностьwidget, потребительский пакет может выполнить компоновку сwidget, чтобы указать, что этот компонент должен быть доступен. Это позволяет проверять вызовыfind_package(), в которых объявлены обязательные компоненты, путём компоновки с соответствующими символическими целями.Для символической интерфейсной библиотеки свойство цели
SYMBOLICимеет значение true.
Импортированные библиотеки
-
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. Он позволяет использовать путь к импортированной библиотеке (часто найденной с помощью командыfind_library()), не зная её тип. Это особенно полезно в Windows, где у статической библиотеки и библиотеки импорта DLL одинаковое расширение файла. - Для библиотеки
-
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 может ссылаться на GLOBAL импортированную цель
Добавлено в версии 3.18: Цель ALIAS может ссылаться на импортированную цель, не являющуюся GLOBAL. Такой псевдоним доступен только в каталоге, где он создан, и его подкаталогах. Свойство цели ALIAS_GLOBAL позволяет проверить, является ли псевдоним глобальным.
Цели ALIAS можно использовать как цели для компоновки и как цели, из которых можно считывать свойства. Их также можно проверять на существование с помощью стандартной подкоманды if(TARGET). <name> нельзя использовать для изменения свойств <target>, то есть его нельзя использовать в качестве операнда команд set_property(), set_target_properties(), target_link_libraries() и т. д. Цель ALIAS нельзя устанавливать или экспортировать.
См. также
© 2000–2026 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/latest/command/add_library.html