LINK_LIBRARIES_ONLY_TARGETS¶
於 3.23 版本新增。
強制要求可作為目標名稱的連結項目實際上是現有的目標。
將此屬性設定為真值,以啟用對 LINK_LIBRARIES
和 INTERFACE_LINK_LIBRARIES
目標屬性內容的額外檢查,這些屬性通常由 target_link_libraries()
填入。檢查也會應用於透過其相依性的 INTERFACE_LINK_LIBRARIES_DIRECT
屬性新增到目標的函式庫。CMake 將驗證可能為目標名稱的連結項目實際上是否命名了現有目標。如果滿足以下條件,則認為一個項目可能是目標名稱:
它不包含
/
或\
,並且它不是以
-
開頭,並且(由於歷史原因)它不是以
$
或`
開頭。
當建立非匯入的目標時,此屬性會由 CMAKE_LINK_LIBRARIES_ONLY_TARGETS
變數的值初始化。可以明確地在匯入的目標上啟用此屬性,以檢查其連結介面。
在以下範例中,CMake 會在組態時停止並顯示錯誤,因為 miLib
不是目標。
set(CMAKE_LINK_LIBRARIES_ONLY_TARGETS ON)
add_library(myLib STATIC myLib.c)
add_executable(myExe myExe.c)
target_link_libraries(myExe PRIVATE miLib) # typo for myLib
為了在仍然強制執行 LINK_LIBRARIES_ONLY_TARGETS
的情況下,按名稱連結工具鏈提供的函式庫,請使用具有 IMPORTED_LIBNAME
目標屬性的 匯入的 介面函式庫。
add_library(toolchain::m INTERFACE IMPORTED)
set_property(TARGET toolchain::m PROPERTY IMPORTED_LIBNAME "m")
target_link_libraries(myExe PRIVATE toolchain::m)
另請參閱政策 CMP0028
。
注意
如果 INTERFACE_LINK_LIBRARIES
包含產生器表達式,其連結項目的實際列表可能會取決於使用目標的類型和屬性。在這種情況下,CMake 可能無法始終檢測到僅對特定使用者出現的遺失目標名稱。具有改進啟發式方法的未來版本的 CMake 可能會開始對先前版本的 CMake 接受的專案觸發錯誤。