LINK_LIBRARIES_STRATEGY¶
在版本 3.31 中加入。
指定在連結器命令列上排序目標直接連結相依項的策略。此屬性由 CMAKE_LINK_LIBRARIES_STRATEGY
變數的值初始化,如果該變數在建立目標時已設定。
CMake 使用目標的 目標連結屬性 來產生目標的連結行。特別是,LINK_LIBRARIES
目標屬性記錄目標的直接連結相依項,通常透過呼叫 target_link_libraries()
來填入。間接連結相依項從 LINK_LIBRARIES
的條目中傳播,這些條目透過追蹤它們的 INTERFACE_LINK_LIBRARIES
屬性的遞移閉包來命名程式庫目標。CMake 支援多種策略,用於名義上排序直接和間接連結相依項,然後針對 工具鏈特定行為 進行篩選。
考慮以下範例以說明以下策略
add_library(A STATIC ...)
add_library(B STATIC ...)
add_library(C STATIC ...)
add_executable(main ...)
target_link_libraries(B PRIVATE A)
target_link_libraries(C PRIVATE A)
target_link_libraries(main PRIVATE A B C)
支援的策略如下
REORDER_MINIMALLY
LINK_LIBRARIES
的條目始終首先出現,並保持其原始順序。原始條目未滿足的間接連結相依項可能會重新排序並相對於彼此去重複,但始終附加在原始條目之後。這可能會導致效率較低的連結行,但讓專案可以控制獨立條目之間的順序。當連結旗標與程式庫混合使用,或多個程式庫提供給定符號時,這種控制可能很重要。這是預設值。
在上面的範例中,此策略透過從其原始條目
A B C
開始,然後附加另一個A
以滿足B
和C
對A
的相依性,來計算main
的連結行。此策略產生的名義順序是A B C A
。請注意,針對 工具鏈特定行為 的額外篩選可能會在產生的建置系統中,於實際的連結器調用中去重複
A
,從而產生A B C
或B C A
。REORDER_FREELY
LINK_LIBRARIES
的條目可能會重新排序、去重複,並與間接連結相依項混合。這可能會產生更有效率的連結行,但不會讓專案可以控制獨立條目之間的順序。在上面的範例中,此策略透過重新排序其原始條目
A B C
以滿足B
和C
對A
的相依性,來計算main
的連結行。此策略產生的名義順序是B C A
。
工具鏈特定行為¶
在上述策略之一產生直接和間接連結相依項的名義順序之後,產生的建置系統中的實際連結器調用可能會根據平台特定的需求和連結器功能去重複條目。請參閱政策 CMP0156
。
例如,如果 REORDER_MINIMALLY
策略產生 A B C A
,則實際的連結行可能會按如下方式去重複 A
如果
A
是靜態程式庫,且連結器自動重新掃描,則保留第一個出現的項目,從而產生A B C
。請參閱政策CMP0179
如果
A
是 Windows 上的共享程式庫,則保留第一個出現的項目,從而產生A B C
。如果
A
是 macOS 或 UNIX 平台上的共享程式庫,則保留最後一個出現的項目,從而產生B C A
。