CMP0083

在 3.14 版本中新增。

為了控制是否產生位置獨立執行檔(Position Independent Executable,PIE),在連結時需要一些標誌。

POSITION_INDEPENDENT_CODE 設定時,CMake 3.13 和更早版本不會加入這些連結標誌。

此政策的 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)