CMP0083¶
3.14 版新增。
为了控制是否生成位置无关可执行文件(Position Independent Executable,PIE),在链接时需要一些标志。
CMake 3.13 及更低版本在设置 POSITION_INDEPENDENT_CODE 时,不会添加这些链接标志。
此策略的 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)