CMAKE_LINK_GROUP_USING_<FEATURE>
Добавлена в версии 3.24.
Эта переменная определяет, как связать группу библиотек для указанной <FEATURE> при использовании генераторного выражения LINK_GROUP. Для того, чтобы эта переменная имела какой-либо эффект, должны быть выполнены оба следующих условия:
- Соответствующая переменная
CMAKE_LINK_GROUP_USING_<FEATURE>_SUPPORTEDдолжна быть установлена в значение true. - Нет специфического для языка определения для той же
<FEATURE>. Это означает, чтоCMAKE_<LANG>_LINK_GROUP_USING_<FEATURE>_SUPPORTEDне может быть установлено в значение true для языка компоновки, используемого целевым объектом, для которого оценивается генераторное выражениеLINK_GROUP.
Переменная CMAKE_<LANG>_LINK_GROUP_USING_<FEATURE> должна быть определена вместо этого для функций, зависящих от языка компоновки.
Имена функций чувствительны к регистру и могут содержать только буквы, цифры и символы подчеркивания. Имена функций, определённые в верхнем регистре, зарезервированы для собственных встроенных функций CMake (см. Предопределённые функции ниже).
Определения функций
Определение группы функций представляет собой список, содержащий ровно два элемента:
<PREFIX> <SUFFIX>
В командной строке компоновщика <PREFIX> предшествует списку библиотек в группе, а <SUFFIX> следует за ним.
Для элементов этой переменной можно использовать префикс LINKER:.
Для передачи параметров инструменту компоновки у каждого компилятора свой синтаксис. Префикс LINKER: и разделитель , могут быть использованы для указания параметров компоновщика портативным способом. LINKER: заменяется соответствующим параметром драйвера, а , — соответствующим разделителем драйвера. Префикс и разделитель драйвера задаются значениями переменных CMAKE_<LANG>_LINKER_WRAPPER_FLAG и CMAKE_<LANG>_LINKER_WRAPPER_FLAG_SEP.
Например, "LINKER:-z,defs" становится -Xlinker -z -Xlinker defs для Clang и -Wl,-z,defs для GNU GCC.
Префикс LINKER: может быть указан как часть выражения префикса SHELL:.
Префикс LINKER: поддерживает, как альтернативный синтаксис, указание аргументов с использованием префикса SHELL: и пробела в качестве разделителя. Предыдущий пример затем становится "LINKER:SHELL:-z defs".
Примечание
Указание префикса SHELL: в любом месте, кроме начала префикса LINKER:, не поддерживается.
Примеры
Решение перекрёстных ссылок между двумя статическими библиотеками
Проект может определить две или более статических библиотек, между которыми существуют циклические зависимости. Для того, чтобы компоновщик смог разрешить все символы во время компоновки, ему может потребоваться неоднократно искать среди библиотек, пока не будут созданы новые неразрешенные ссылки. Разные компоновщики используют разный синтаксис для достижения этого. Следующий пример демонстрирует, как это может быть реализовано для некоторых компоновщиков. Обратите внимание, что это только для иллюстративных целей. Проекты должны использовать встроенную функцию группы RESCAN вместо этого (см. Предопределённые функции), которая обеспечивает более полную и надёжную реализацию этой функциональности.
set(CMAKE_C_LINK_GROUP_USING_cross_refs_SUPPORTED TRUE)
if(CMAKE_C_COMPILER_ID STREQUAL "GNU" AND CMAKE_SYSTEM_NAME STREQUAL "Linux")
set(CMAKE_C_LINK_GROUP_USING_cross_refs
"LINKER:--start-group"
"LINKER:--end-group"
)
elseif(CMAKE_C_COMPILER_ID STREQUAL "SunPro" AND CMAKE_SYSTEM_NAME STREQUAL "SunOS")
set(CMAKE_C_LINK_GROUP_USING_cross_refs
"LINKER:-z,rescan-start"
"LINKER:-z,rescan-end"
)
else()
# feature not yet supported for the other environments
set(CMAKE_C_LINK_GROUP_USING_cross_refs_SUPPORTED FALSE)
endif()
add_library(lib1 STATIC ...)
add_library(lib2 SHARED ...)
if(CMAKE_C_LINK_GROUP_USING_cross_refs_SUPPORTED)
target_link_libraries(lib2 PRIVATE "$<LINK_GROUP:cross_refs,lib1,external>")
else()
target_link_libraries(lib2 PRIVATE lib1 external)
endif()
CMake сгенерирует следующие фрагменты командной строки компоновщика при компоновке lib2:
-
GNU:-Wl,--start-group /path/to/lib1.a -lexternal -Wl,--end-group -
SunPro:-Wl,-z,rescan-start /path/to/lib1.a -lexternal -Wl,-z,rescan-end
Предопределённые функции
Следующие встроенные функции групп предопределены CMake:
-
RESCAN -
Некоторые компоновщики работают только в один проход. Для таких компоновщиков циклические ссылки между библиотеками обычно приводят к неразрешенным символам. Эта функция инструктирует компоновщик повторно искать указанные статические библиотеки до тех пор, пока не будут созданы новые неразрешенные ссылки.
Обычно статическая библиотека ищется только один раз в порядке, в котором она указана в командной строке. Если символ в этой библиотеке нужен для разрешения неразрешенного символа, на который ссылается объект в библиотеке, которая появляется позже в командной строке, компоновщик не сможет разрешить эту ссылку. Сгруппировав статические библиотеки с помощью функции
RESCAN, все они будут искомы повторно, пока все возможные ссылки не будут разрешены. Это будет использовать параметры компоновщика, такие как--start-groupи--end-group, или на SunOS,-z rescan-startи-z rescan-end.Использование этой функции влечёт существенные затраты на производительность. Лучше всего использовать её только в случае неизбежных циклических ссылок между двумя или более статическими библиотеками.
Эта функция доступна при использовании инструментальных цепочек, нацеленных на Linux, BSD и SunOS. Она также может быть использована при нацеливании на платформы Windows, если используется инструментальная цепочка GNU.
© 2000–2024 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.31/variable/CMAKE_LINK_GROUP_USING_FEATURE.html