Spec-Zone.ru › CMake

CheckLinkerFlag

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

Этот модуль предоставляет команду для проверки поддержки компилятором заданного флага компоновщика.

Подключите этот модуль в проекте CMake с помощью:

include(CheckLinkerFlag)

Команды

Этот модуль предоставляет следующую команду:

check_linker_flag

Однократно проверяет, поддерживает ли компилятор заданный флаг компоновщика:

check_linker_flag(<lang> <flag> <variable>)

Эта команда однократно проверяет, принимает ли компоновщик флаг <flag> без выдачи диагностического сообщения компилятором <lang>.

Аргументы:

<lang>

Язык компилятора, используемый для проверки. Поддерживаются языки C, CXX, CUDA, Fortran, HIP, OBJC, OBJCXX и Swift.

Добавлено в версии 3.19: поддержка языка CUDA.

Добавлено в версии 3.21: поддержка языка HIP.

Добавлено в версии 3.26: поддержка языка Swift.

<flag>

Флаг(и) компоновщика для проверки. Несколько флагов можно указать одним аргументом в виде строки, используя список, разделённый точками с запятой.

В основе реализации лежит использование свойства цели LINK_OPTIONS для проверки указанного флага. Можно использовать префиксы LINKER: (и SHELL:), как описано в разделе Обработка различий драйверов компилятора.

<variable>

Имя переменной, в которую будет сохранён результат проверки. Эта переменная будет создана как внутренняя переменная кэша.

Эта команда временно задаёт переменную CMAKE_REQUIRED_LINK_OPTIONS и вызывает команду check_source_compiles() из модуля CheckSourceCompiles.

Успешный результат означает лишь, что компилятор не сообщил об ошибке при передаче ему флага компоновщика. Вопрос о том, оказывает ли флаг какой-либо эффект и соответствует ли он ожидаемому, выходит за рамки этого модуля.

Примечание

Поскольку базовая команда try_compile() также использует флаги из таких переменных, как CMAKE_<LANG>_FLAGS, неизвестные или неподдерживаемые флаги в этих переменных могут привести к ложноотрицательному результату этой проверки.

Переменные, влияющие на проверку

Перед вызовом этой команды можно задать следующие переменные, чтобы изменить способ выполнения проверки:

CMAKE_REQUIRED_FLAGS

Строка дополнительных флагов, передаваемых компилятору и разделённых пробелами. Список, разделённый точками с запятой, использовать нельзя. Содержимое CMAKE_<LANG>_FLAGS и связанных с ней переменных CMAKE_<LANG>_FLAGS_<CONFIG> для конкретных конфигураций автоматически добавляется перед содержимым этой переменной в команду компилятора.

CMAKE_REQUIRED_DEFINITIONS

Список, разделённый точками с запятой определений компилятора, каждое из которых имеет вид -DFOO или -DFOO=bar. Определение для имени, заданного аргументом команды проверки, указывающим переменную результата, также добавляется автоматически.

CMAKE_REQUIRED_INCLUDES

Список, разделённый точками с запятой, путей поиска заголовочных файлов, передаваемых компилятору. Будут использоваться только эти пути поиска заголовочных файлов; содержимое свойства каталога INCLUDE_DIRECTORIES будет проигнорировано.

CMAKE_REQUIRED_LIBRARIES

Список, разделённый точками с запятой, библиотек, добавляемых в команду компоновки. Это могут быть имена системных библиотек или импортированные цели (подробности см. в описании команды try_compile()).

CMAKE_REQUIRED_LINK_DIRECTORIES

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

Список, разделённый точками с запятой, путей поиска библиотек, передаваемых компоновщику (подробности см. в описании команды try_compile()).

CMAKE_REQUIRED_QUIET

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

Если значение этой переменной является логическим истинным значением, все сообщения о состоянии, связанные с проверкой, будут подавлены.

Обработка различий драйверов компилятора

У каждого драйвера компилятора свой синтаксис передачи параметров инструменту компоновщика. Префикс 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:, не поддерживается.

Примеры

Пример: проверка флага компоновщика

В следующем примере показано, как использовать этот модуль для проверки флага компоновщика -z relro, поддерживаемого во многих Unix-подобных системах для включения перемещений только для чтения с целью повышения безопасности двоичных файлов. Если компоновщик поддерживает этот флаг, он условно добавляется к цели исполняемого файла с помощью команды target_link_options(). Префикс LINKER: используется для переносимой и независимой от компилятора передачи флага компоновщику.

include(CheckLinkerFlag)

check_linker_flag(C "LINKER:-z,relro" HAVE_Z_RELRO)

add_executable(example main.c)

if(HAVE_Z_RELRO)
  target_link_options(example PRIVATE "LINKER:-z,relro")
endif()

Пример: проверка нескольких флагов

В следующем примере одновременно проверяется несколько флагов компоновщика:

include(CheckLinkerFlag)

check_linker_flag(C "LINKER:-z,relro;LINKER:-z,now" HAVE_FLAGS)

add_executable(example main.c)

if(HAVE_FLAGS)
  target_link_options(example PRIVATE LINKER:-z,relro LINKER:-z,now)
endif()

См. также

  • Переменная CMAKE_LINKER_TYPE для указания компоновщика, который также будет использоваться этим модулем.
  • Модуль CheckCompilerFlag для проверки поддержки флага компилятора.

© 2000–2026 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/latest/module/CheckLinkerFlag.html

Spec-Zone.ru

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