CMP0083

3.14 版本中添加。

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

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

此策略的 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 标志。

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)