CMP0083

3.14 版新增。

为了控制生成位置无关可执行文件(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)