CheckPIESupported
Добавлено в версии 3.14.
Этот модуль предоставляет команду для проверки поддержки компоновщиком кода, независимого от позиции (PIE), или кода, не независимого от позиции (NO_PIE), для исполняемых файлов.
Подключите этот модуль в проекте CMake с помощью:
include(CheckPIESupported)
При установке свойства целевого объекта POSITION_INDEPENDENT_CODE параметры компиляции и компоновки, связанные с PIC, добавляются при сборке объектов библиотек, а параметры компиляции, связанные с PIE, — при сборке объектов исполняемых целевых объектов независимо от этого модуля. Используйте этот модуль, чтобы обеспечить также учет свойства целевого объекта POSITION_INDEPENDENT_CODE для исполняемых файлов во время компоновки.
Команды
Этот модуль предоставляет следующую команду:
-
check_pie_supported -
Проверяет поддержку PIE/NO_PIE и подготавливает все исполняемые файлы к включению параметров PIE на этапе компоновки:
check_pie_supported([OUTPUT_VARIABLE <output>] [LANGUAGES <langs>...])
Доступны следующие параметры:
-
OUTPUT_VARIABLE <output> -
Задает переменную
<output>со сведениями о любых ошибках. Если проверка пропущена из-за использования кэшированных результатов предыдущего вызова, вывод будет пустым, даже если при предыдущем вызове возникали ошибки. -
LANGUAGES <langs>... -
Проверяет компоновщики, используемые для каждого из указанных языков. Если этот параметр не указан, команда проверяет все включенные языки.
Поддерживаются
C,CXX,Fortran.Добавлено в версии 3.23: поддерживаются
OBJC,OBJCXX,CUDAиHIP.
Примечание
Для использования
check_pie_supported()политикаCMP0083должна иметь значениеNEW; в противном случае возникнет фатальная ошибка. -
Переменные
Для каждого проверяемого языка команда check_pie_supported() определяет две логические переменные кэша:
-
CMAKE_<lang>_LINK_PIE_SUPPORTED -
Устанавливается в значение true, если компоновщик поддерживает
PIE, и в false в противном случае. -
CMAKE_<lang>_LINK_NO_PIE_SUPPORTED -
Устанавливается в значение true, если компоновщик поддерживает
NO_PIE, и в false в противном случае.
Примеры
Чтобы включить PIE также на этапе компоновки исполняемого целевого объекта, подключите этот модуль и вызовите check_pie_supported() до установки свойства целевого объекта POSITION_INDEPENDENT_CODE. Это позволит определить, поддерживает ли компоновщик для каждого проверяемого языка параметры компоновки, связанные с PIE. Например:
add_executable(foo ...) include(CheckPIESupported) check_pie_supported() set_property(TARGET foo PROPERTY POSITION_INDEPENDENT_CODE TRUE)
Поскольку не все компоновщики требуют или поддерживают параметры компоновки, связанные с PIE (например, MSVC), может быть полезно получить сообщения об ошибках для записи в журнал:
add_executable(foo ...)
message(CHECK_START "Checking for C linker PIE support")
include(CheckPIESupported)
check_pie_supported(OUTPUT_VARIABLE output LANGUAGES C)
set_property(TARGET foo PROPERTY POSITION_INDEPENDENT_CODE TRUE)
if(CMAKE_C_LINK_PIE_SUPPORTED)
message(CHECK_PASS "yes")
else()
message(CHECK_FAIL "no")
message(VERBOSE "PIE is not supported at link time:\n${output}"
"PIE link options will not be passed to linker.")
endif()
Установка свойства целевого объекта POSITION_INDEPENDENT_CODE для исполняемого файла без этого модуля задает параметры компиляции, связанные с PIE, но не параметры компоновки, связанные с PIE, чего в некоторых случаях может быть недостаточно:
add_executable(foo ...) set_property(TARGET foo PROPERTY POSITION_INDEPENDENT_CODE TRUE)
© 2000–2026 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/latest/module/CheckPIESupported.html