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)