CMP0156

在版本 3.29 中新增。

根據連結器的功能,在連結行上去除重複的函式庫。

傳統連結器在連結期間維護一組未定義的符號。連結器按照它們在命令列上出現的順序處理每個檔案,直到未定義符號的集合變為空。當遇到物件檔案時,它會被連結到輸出物件中,其未定義的符號會被添加到集合中。當遇到封存檔時,傳統連結器會搜尋其中包含的物件,並處理那些滿足未解析集合中符號的物件。

當使用傳統連結器時,處理相互依賴的封存檔可能會很麻煩。封存檔可能必須指定多次。

一些連結器(例如 Apple 或 Windows 連結器,以及 LLVM LLD)在迭代命令列參數時,會記錄在物件和封存檔中找到的所有符號。當這些連結器之一遇到可以由先前處理過的封存檔中包含的物件檔案解析的未定義符號時,它會立即提取並將其連結到輸出物件中。

CMake 3.28 及更低版本可能會產生重複靜態函式庫的連結行,如同傳統連結器需要的那樣,即使在使用不需要它的連結器時也是如此。它們也可能通過保留共享函式庫的最後一次出現來去除重複項,這在 Windows 平台上可能會更改 DLL 載入順序。

CMake 3.29 及更高版本更傾向於根據連結器功能應用不同的策略。因此,當目標平台為 Apple 和 Windows 平台時,所有函式庫都會被去除重複項。此外,在 Windows 平台上,函式庫會通過保留它們的第一次出現來去除重複項,從而尊重專案指定的順序。此政策提供了與尚未更新以預期後者行為的專案的相容性。

注意

當此政策設定為 NEW 時,政策 CMP0179 控制在去除重複項時保留靜態函式庫的哪一次出現。

此政策的 OLD 行為始終重複靜態函式庫,如同使用傳統連結器一樣,並且始終通過保留每個共享函式庫的最後一次出現來去除重複項。此政策的 NEW 行為是根據連結器功能應用不同的策略。

此政策在 CMake 版本 3.29 中引入。它可以通過 cmake_policy()cmake_minimum_required() 設置。如果未設置,CMake 不會發出警告,並使用 OLD 行為。

注意

政策的 OLD 行為根據 定義已棄用,並可能在 CMake 的未來版本中移除。