CMAKE_LINK_LIBRARY_<FEATURE>_ATTRIBUTES¶
於 3.30 版本新增。
此變數定義指定連結庫 <FEATURE>
的行為。它指定 <FEATURE>
如何與其他特性互動、何時應該應用 <FEATURE>
,以及當 CMake 組裝最終連結器命令列時,應如何處理 <FEATURE>
的各方面(例如,重複資料刪除)。
<FEATURE>
的連結器標記語法由 CMAKE_<LANG>_LINK_LIBRARY_USING_<FEATURE>
和 CMAKE_LINK_LIBRARY_USING_<FEATURE>
變數控制。CMAKE_<LANG>_LINK_LIBRARY_USING_<FEATURE>_SUPPORTED
和 CMAKE_LINK_LIBRARY_USING_<FEATURE>_SUPPORTED
變數控制是否根本可以使用 <FEATURE>
。
當為特定語言 <LANG>
進行連結時,如果同時也為相同的 <FEATURE>
定義了 CMAKE_<LANG>_LINK_LIBRARY_<FEATURE>_ATTRIBUTES
變數,則會忽略 CMAKE_LINK_LIBRARY_<FEATURE>_ATTRIBUTES
。
在定義目標的目錄範圍結尾時,CMAKE_LINK_LIBRARY_<FEATURE>_ATTRIBUTES
和 CMAKE_<LANG>_LINK_LIBRARY_<FEATURE>_ATTRIBUTES
的值才是重要的。
特性屬性定義¶
特性屬性定義是 以分號分隔的清單,其中包含 attribute=value(s)
項目。如果屬性有多個值,這些值必須以逗號分隔。
支援以下屬性
LIBRARY_TYPE=<library-type-list>
指定特性支援的程式庫類型。支援的值有:
STATIC
、SHARED
、MODULE
和EXECUTABLE
。如果未指定此屬性,則預設值為
LIBRARY_TYPE=STATIC,SHARED,MODULE,EXECUTABLE
。如果將特性用於不受支援的程式庫類型,CMake 會發出開發人員警告,並忽略該特性。
OVERRIDE=<feature-list>
指定在發生衝突時,此特性會取代哪些特性。如果定義了
LINK_LIBRARY_OVERRIDE
或LINK_LIBRARY_OVERRIDE_<LIBRARY>
目標屬性定義,則此覆寫機制會被其取代。如果未指定此屬性,則預設值為空清單。
DEDUPLICATION=YES|NO|DEFAULT
指定使用此特性的程式庫的重複資料刪除策略。
YES
一律重複資料刪除該程式庫。CMake 通常會套用的預設策略會被忽略。
NO
永遠不會重複資料刪除該程式庫。CMake 通常會套用的預設策略會被忽略。
DEFAULT
讓 CMake 自動判斷重複資料刪除策略。
如果未指定此屬性,則會使用
DEFAULT
。
範例¶
常見的需求是載入完整封存檔,作為建立共用程式庫的一部分。內建的 WHOLE_ARCHIVE
特性可用於此目的。該內建特性的實作會設定以下連結程式庫特性屬性
set(CMAKE_LINK_LIBRARY_WHOLE_ARCHIVE_ATTRIBUTES
LIBRARY_TYPE=STATIC
OVERRIDE=DEFAULT
DEDUPLICATION=YES
)
LIBRARY_TYPE=STATIC
此特性僅對靜態程式庫有意義。
OVERRIDE=DEFAULT
DEFAULT
特性會被WHOLE_ARCHIVE
特性覆寫,因為它們相容且可提升使用者體驗:標準程式庫規格和$<LINK_LIBRARY:WHOLE_ARCHIVE>
可以自由使用。DEDUPLICATION=YES
當使用此特性時,連結器會從靜態程式庫載入所有符號,因此無需在連結器命令列中重複該程式庫。
WHOLE_ARCHIVE
特性可以這樣使用
add_library(A STATIC ...)
add_library(B STATIC ...)
target_link_libraries(B PUBLIC A)
target_link_libraries(A PUBLIC B)
add_library(global SHARED ...)
target_link_libraries(global PRIVATE $<LINK_LIBRARY:WHOLE_ARCHIVE,A>)
產生的連結命令只會指定一個 A
程式庫實例,且連結器標記會確保從 A
程式庫載入所有符號。