CheckPIESupported¶
3.14 版新增。
此模块提供 check_pie_supported()
函数,用于检查链接器是否支持可执行文件的位置独立代码 (PIE) 或非位置独立代码 (NO_PIE)。
设置 POSITION_INDEPENDENT_CODE
目标属性时,无论此模块如何,在构建库对象时都会添加与 PIC 相关的编译和链接选项,在构建可执行目标对象时都会添加与 PIE 相关的编译选项。使用此模块可确保可执行文件的 POSITION_INDEPENDENT_CODE
目标属性在链接时也受到尊重。
- check_pie_supported¶
check_pie_supported([OUTPUT_VARIABLE <output>] [LANGUAGES <lang>...])
选项包括
OUTPUT_VARIABLE <output>
设置
<output>
变量,其中包含任何错误的详细信息。如果检查由于使用先前调用的缓存结果而被绕过,则即使先前调用中存在错误,输出也将为空。LANGUAGES <lang>...
检查用于每个指定语言的链接器。如果未提供此选项,则命令将检查所有已启用的语言。
支持
C
、CXX
、Fortran
。版本 3.23 新增: 支持
OBJC
、OBJCXX
、CUDA
和HIP
。
注意
要使用
check_pie_supported()
,策略CMP0083
必须设置为NEW
;否则,将发生致命错误。
变量¶
对于检查的每种语言,check_pie_supported()
函数定义两个布尔缓存变量
CMAKE_<lang>_LINK_PIE_SUPPORTED
如果链接器支持
PIE
,则设置为 true,否则设置为 false。CMAKE_<lang>_LINK_NO_PIE_SUPPORTED
如果链接器支持
NO_PIE
,则设置为 true,否则设置为 false。
示例¶
要在链接时也启用可执行目标上的 PIE,请包含此模块并在设置 POSITION_INDEPENDENT_CODE
目标属性之前调用 check_pie_supported()
。这将确定每种被检查语言的链接器是否支持与 PIE 相关的链接选项。例如
add_executable(foo ...)
include(CheckPIESupported)
check_pie_supported()
set_property(TARGET foo PROPERTY POSITION_INDEPENDENT_CODE TRUE)
由于并非所有链接器都需要或支持与 PIE 相关的链接选项(例如 MSVC
),因此检索任何错误消息可能对日志记录有用
add_executable(foo ...)
include(CheckPIESupported)
check_pie_supported(OUTPUT_VARIABLE output LANGUAGES C)
set_property(TARGET foo PROPERTY POSITION_INDEPENDENT_CODE TRUE)
if(NOT CMAKE_C_LINK_PIE_SUPPORTED)
message(WARNING "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)