CMP0083¶
3.14 版新增。
为了控制是否生成地址无关可执行文件(PIE),链接阶段需要某些特定的标志。
当设置了 POSITION_INDEPENDENT_CODE 属性时,CMake 3.13 及更低版本不会自动添加这些链接标志。
此策略的 OLD(旧)行为是不管理 PIE 链接标志。而 NEW(新)行为是,如果设置了 POSITION_INDEPENDENT_CODE,则添加链接标志。
设置为
TRUE:将生成地址无关可执行文件的标志传递给链接器步骤。例如对于GCC使用-pie。设置为
FALSE:将不生成地址无关可执行文件的标志传递给链接器步骤。例如对于GCC使用-no-pie。未设置:不向链接器步骤传递任何标志。
由于给定的链接器可能并非在所有使用的环境中都支持 PIE 标志,因此项目有责任使用 CheckPIESupported 模块来检查支持情况,以确保可执行文件的 POSITION_INDEPENDENT_CODE 目标属性在链接时能够生效。
此策略是在 CMake 3.14 版本中引入的。它可以通过 cmake_policy() 或 cmake_minimum_required() 进行设置。如果未设置,CMake *不会*发出警告,并使用 OLD 行为。
注意
Android 平台对 PIE 有特殊处理,因此不需要使用 CheckPIESupported 模块来确保标志被传递给链接器。
注意
策略的 OLD 行为根据定义已被弃用,并可能在未来版本的 CMake 中被移除。
示例¶
表现得像 CMake 3.13 一样,不在链接阶段应用任何 PIE 标志。
cmake_minimum_required(VERSION 3.13)
project(foo)
# ...
add_executable(foo ...)
set_property(TARGET foo PROPERTY POSITION_INDEPENDENT_CODE TRUE)
使用 CheckPIESupported 模块检测当前链接器和环境是否支持 PIE。仅当链接器支持时才应用 PIE 标志。
cmake_minimum_required(VERSION 3.14) # CMP0083 NEW
project(foo)
include(CheckPIESupported)
check_pie_supported()
# ...
add_executable(foo ...)
set_property(TARGET foo PROPERTY POSITION_INDEPENDENT_CODE TRUE)