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