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
。