Spec-Zone.ru › CMake 3.25

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–2022 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.24/variable/CMAKE_LINK_GROUP_USING_FEATURE.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API