INTERFACE_AUTOMOC_MACRO_NAMES

在 3.27 版本中新增。

一个 分号分隔的列表,包含要传播给使用者(consumers)的 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_2。然后,moc 工具将自动运行 myapp 的任何包含 STATIC_LIB_1STATIC_LIB_2 的源文件。

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,这些宏名称还将通过传递(transitively)进一步传播到 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 的源文件将被 moc 处理,如果它们包含 SHARED_LINK_LIB

  • static_lib 的源文件将被 moc 处理,如果它们包含 STATIC_LINK_LIB

  • app 的源文件将被 moc 处理,如果它们包含 SHARED_LINK_LIBSTATIC_LINK_LIBINTERFACE_LINK_LIB