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 中移除。