CMP0083

在版本 3.14 中添加。

为了控制生成位置无关可执行文件 (PIE),链接时需要一些标志。

当设置 POSITION_INDEPENDENT_CODE 时,CMake 3.13 及更低版本不会添加这些链接标志。

此策略的 OLD 行为是不管理 PIE 链接标志。NEW 行为是在设置 POSITION_INDEPENDENT_CODE 时添加链接标志

  • 设置为 TRUE:将生成位置无关可执行文件的标志传递给链接器步骤。例如,-pie 用于 GCC

  • 设置为 FALSE:将不生成位置无关可执行文件的标志传递给链接器步骤。例如,-no-pie 用于 GCC

  • 未设置:不向链接器步骤传递任何标志。

由于给定的链接器可能不支持在其使用的所有环境中使用 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 时才应用 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)