INTERFACE_AUTOMOC_MACRO_NAMES

在版本 3.27 中新增。

一個以分號分隔的列表,其中包含要傳播給使用者的 AUTOMOC 的巨集名稱。

當啟用 AUTOMOC 的目標連結到設定了 INTERFACE_AUTOMOC_MACRO_NAMES 的函式庫時,該目標會繼承列出的巨集名稱,並將其與其自身的 AUTOMOC_MACRO_NAMES 屬性中指定的巨集名稱合併。然後,該目標將自動為包含繼承的巨集名稱的來源檔案產生 MOC 檔案,而不僅僅是其自身的 AUTOMOC_MACRO_NAMES 屬性中指定的巨集名稱。

預設情況下,INTERFACE_AUTOMOC_MACRO_NAMES 是空的。

有關將 CMake 與 Qt 結合使用的更多資訊,請參閱 cmake-qt(7) 手冊。

範例 1

在此範例中,myappstatic_lib 繼承巨集名稱 STATIC_LIB_1STATIC_LIB_2moc 工具接著會自動在任何包含 STATIC_LIB_1STATIC_LIB_2myapp 來源檔案上執行。

set(AUTOMOC ON)
add_executable(myapp main.cpp)
target_link_libraries(myapp PRIVATE static_lib)

add_library(static_lib STATIC static.cpp)
set_property(TARGET static_lib PROPERTY
  INTERFACE_AUTOMOC_MACRO_NAMES "STATIC_LIB_1;STATIC_LIB_2"
)

範例 2

在此範例中,各種 *_deep_lib 函式庫的 INTERFACE_AUTOMOC_MACRO_NAMES 目標屬性將會傳播到 shared_libstatic_libinterface_lib。由於連結關係被指定為 PUBLICINTERFACE,因此這些巨集名稱也會進一步以遞迴的方式傳播到 app

set(AUTOMOC ON)

add_library(shared_deep_lib SHARED deep_lib.cpp)
add_library(static_deep_lib STATIC deep_lib.cpp)
add_library(interface_deep_lib INTERFACE)

set_property(TARGET shared_deep_lib PROPERTY
  INTERFACE_AUTOMOC_MACRO_NAMES "SHARED_LINK_LIB"
)
set_property(TARGET static_deep_lib PROPERTY
  INTERFACE_AUTOMOC_MACRO_NAMES "STATIC_LINK_LIB"
)
set_property(TARGET interface_deep_lib PROPERTY
  INTERFACE_AUTOMOC_MACRO_NAMES "INTERFACE_LINK_LIB"
)

add_library(shared_lib SHARED lib.cpp)
add_library(static_lib STATIC lib.cpp)
add_library(interface_lib INTERFACE)

# PUBLIC and INTERFACE here ensure the macro names propagate to any
# consumers of shared_lib, static_lib or interface_lib too
target_link_libraries(shared_lib PUBLIC shared_deep_lib)
target_link_libraries(static_lib PUBLIC static_deep_lib)
target_link_libraries(interface_lib INTERFACE interface_deep_lib)

# This consumer will receive all three of the above custom macro names as
# transitive usage requirements
add_executable(app main.cpp)
target_link_libraries(app PRIVATE shared_lib static_lib interface_lib)

在以上範例中

  • 如果 shared_lib 來源檔案包含 SHARED_LINK_LIB,則會由 moc 處理。

  • 如果 static_lib 來源檔案包含 STATIC_LINK_LIB,則會由 moc 處理。

  • 如果 app 來源檔案包含 SHARED_LINK_LIBSTATIC_LINK_LIBINTERFACE_LINK_LIB,則會由 moc 處理。