CMAKE_LINK_LIBRARY_<FEATURE>_ATTRIBUTES
Новое в версии 3.30.
Эта переменная определяет поведение указанной библиотеки линковки <FEATURE>. Она определяет, как <FEATURE> взаимодействует с другими функциями, когда <FEATURE> должно применяться, и аспекты обработки <FEATURE> при сборке CMake конечной командной строки линковщика (например, дедубликация).
Синтаксис флагов линковщика для <FEATURE> контролируется переменными CMAKE_<LANG>_LINK_LIBRARY_USING_<FEATURE> и CMAKE_LINK_LIBRARY_USING_<FEATURE>. Переменные CMAKE_<LANG>_LINK_LIBRARY_USING_<FEATURE>_SUPPORTED и CMAKE_LINK_LIBRARY_USING_<FEATURE>_SUPPORTED управляют доступностью <FEATURE>.
При линковке для определённого языка <LANG>, CMAKE_LINK_LIBRARY_<FEATURE>_ATTRIBUTES игнорируется, если переменная CMAKE_<LANG>_LINK_LIBRARY_<FEATURE>_ATTRIBUTES также определена для того же <FEATURE>.
Значение CMAKE_LINK_LIBRARY_<FEATURE>_ATTRIBUTES и CMAKE_<LANG>_LINK_LIBRARY_<FEATURE>_ATTRIBUTES в конце области каталога, в которой определён целевой объект, имеет значение.
Определение атрибутов функции
Определение атрибутов функции — это список, разделённый точкой с запятой элементов attribute=value(s). Если атрибут имеет несколько значений, эти значения должны быть разделены запятыми.
Поддерживаются следующие атрибуты:
-
LIBRARY_TYPE=<library-type-list> -
Указывает типы библиотек, поддерживаемые функцией. Допустимые значения:
STATIC,SHARED,MODULE, иEXECUTABLE.Если этот атрибут не указан, значение по умолчанию —
LIBRARY_TYPE=STATIC,SHARED,MODULE,EXECUTABLE.Если функция используется с типом библиотеки, который не поддерживается, CMake выведет предупреждение для разработчика, и функция будет проигнорирована.
-
OVERRIDE=<feature-list> -
Указывает, какие функции эта функция заменяет в случае конфликта. Этот механизм переопределения заменён на
LINK_LIBRARY_OVERRIDEилиLINK_LIBRARY_OVERRIDE_<LIBRARY>определения свойств целевого объекта, если они определены.Если этот атрибут не указан, значение по умолчанию — пустой список.
-
DEDUPLICATION=YES|NO|DEFAULT -
Указывает стратегию дедупликации для библиотеки, использующей эту функцию.
-
YES -
Библиотека всегда дедублицируется. Стратегия по умолчанию, которая обычно применяется CMake, игнорируется.
-
NO -
Библиотека никогда не дедублицируется. Стратегия по умолчанию, которая обычно применяется CMake, игнорируется.
-
DEFAULT -
CMake автоматически определяет стратегию дедупликации.
Если этот атрибут не указан, используется
DEFAULT. -
Пример
Частая необходимость — загрузка полного архива в рамках создания динамической библиотеки. Для этого можно использовать встроенную функцию WHOLE_ARCHIVE. Реализация этой встроенной функции задаёт следующие атрибуты функции линковки библиотек:
set(CMAKE_LINK_LIBRARY_WHOLE_ARCHIVE_ATTRIBUTES LIBRARY_TYPE=STATIC OVERRIDE=DEFAULT DEDUPLICATION=YES )
-
LIBRARY_TYPE=STATIC -
Эта функция имеет смысл только для статических библиотек.
-
OVERRIDE=DEFAULT -
Функция
DEFAULTбудет переопределена функциейWHOLE_ARCHIVE, поскольку они совместимы и улучшают пользовательский опыт: стандартные спецификации библиотек и$<LINK_LIBRARY:WHOLE_ARCHIVE>могут использоваться свободно. -
DEDUPLICATION=YES -
При использовании этой функции линковщик загружает все символы из статической библиотеки, поэтому нет необходимости повторять библиотеку в командной строке линковщика.
Функция WHOLE_ARCHIVE может использоваться следующим образом:
add_library(A STATIC ...) add_library(B STATIC ...) target_link_libraries(B PUBLIC A) target_link_libraries(A PUBLIC B) add_library(global SHARED ...) target_link_libraries(global PRIVATE $<LINK_LIBRARY:WHOLE_ARCHIVE,A>)
В результате команда линковки будет содержать только один экземпляр библиотеки A, а флаги линковщика будут гарантировать загрузку всех символов из библиотеки A.
© 2000–2024 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.30/variable/CMAKE_LINK_LIBRARY_FEATURE_ATTRIBUTES.html