Spec-Zone.ru › CMake

CMAKE__LINK_GROUP_USING_

Добавлен в версии 3.24.

Эта переменная определяет, как слинковать группу библиотек для указанного <FEATURE> при использовании генераторного выражения LINK_GROUP и языке линковки для целевого объекта <LANG>. Для того, чтобы эта переменная имела какой-либо эффект, связанная переменная CMAKE_<LANG>_LINK_GROUP_USING_<FEATURE>_SUPPORTED должна быть установлена в значение true.

Переменная CMAKE_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/latest/variable/CMAKE_LANG_LINK_GROUP_USING_FEATURE.html

Spec-Zone.ru

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