qt_wrap_cpp
从源代码创建 .moc 文件。
该命令在Qt6
软件包的Core
组件中定义,可以像这样加载:
find_package(Qt6 REQUIRED COMPONENTS Core)
该命令在 Qt 5.0 中引入。
简介
qt_wrap_cpp
支持两种签名。第一个签名是在 Qt 6.8 中添加的,其形式如下:
qt_wrap_cpp(<TARGET> src_file1 [src_file2 ...] [OPTIONS ...] [DEPENDS ...])
注意: 建议使用上述签名,而不是旧签名。
qt_wrap_cpp(<VAR> src_file1 [src_file2 ...] [TARGET target] [OPTIONS ...] [DEPENDS ...])
如果禁用了无版本命令,请使用qt6_wrap_cpp()
代替。它支持与本命令相同的参数集。
说明
在给定的源文件上创建调用Meta-Object Compiler (moc)的规则。每个输入文件都会在构建目录中生成一个输出文件。生成文件的路径将添加到<VAR>
中。
注意: 这是一个低级宏。请参阅CMake AUTOMOC 文档,了解使用moc
处理源文件的更便捷方法。
参数
您可以设置一个显式TARGET
。这将确保在使用moc
扫描源文件时,目标属性INCLUDE_DIRECTORIES
和COMPILE_DEFINITIONS
也会被使用。
自 Qt XML 6.8 起,当传递源文件到qt_wrap_cpp
而不是头文件来为目标生成.moc
文件时,需要使用TARGET
参数为源文件中生成的.moc
文件设置正确的包含路径。由于生成的.moc
文件是通过qt_wrap_cpp
添加到目标的源文件中的,因此不会添加到<VAR>
中。
您可以设置应添加到moc
调用的其他OPTIONS
。您可以在moc 文档中找到可能的选项。
当设置TARGET
时,OPTIONS
可以评估生成器表达式。
注意: 如果OPTIONS
同时包含生成器表达式和特殊字符,请使用变量来实现它们。例如,使用$<ANGLE-R>
,$<COMMA>
和$<SEMICOLON>
代替>
,,
和:
。否则,生成器表达式将无法正确评估。OPTIONS
封装在生成器表达式中,因此必须转义其中的特殊字符。
DEPENDS
允许为重新生成文件添加额外的依赖关系。这在源文件具有隐式依赖关系时非常有用,比如 Qt XML 插件的代码中包含一个使用 () 宏的 文件。Q_PLUGIN_METADATA .json
示例
自 Qt 6.8 起:
qt_add_executable(myapp myapp.cpp main.cpp) qt_wrap_cpp(myapp myapp.cpp)
// myapp.cpp #include "myapp.h" #include <QObject> class MyApp : public QObject { Q_OBJECT public: MyApp() = default; }; #include "myapp.moc"
在上述文件中,myapp.moc
包含在myapp.cpp
中。要生成myapp.moc
文件,需要使用带有TARGET
参数的qt_wrap_cpp
宏。.moc
文件及其路径将通过qt_wrap_cpp
宏添加到目标的 sources 和 include 目录中。
旧版本
set(SOURCES myapp.cpp main.cpp) qt_wrap_cpp(SOURCES myapp.h) qt_add_executable(myapp ${SOURCES})
在下面的示例中,传入OPTIONS
的生成器表达式将在TARGET
设置后进行评估。这样指定参数是为了避免生成器表达式出现语法错误。
set(SOURCES myapp.cpp main.cpp) qt_wrap_cpp(SOURCES myapp.h TARGET myapp OPTIONS "$<$<CONFIG:Debug>:-DMY_OPTION_FOR_DEBUG>" "-DDEFINE_CMDLINE_SIGNAL=void cmdlineSignal(const QMap<int, int> &i)" "$<$<CONFIG:Debug>:-DDEFINE_CMDLINE_SIGNAL_IN_GENEX=void cmdlineSignal(const QMap<int$<COMMA> int$<ANGLE-R> &i)>") qt_add_executable(myapp ${SOURCES})
下面的示例使用target_compile_definitions设置了COMPILE_DEFINITIONS,它将被添加到OPTIONS
中。
set(SOURCES myapp.cpp main.cpp) qt_wrap_cpp(SOURCES myapp.h TARGET myapp) qt_add_executable(myapp ${SOURCES}) target_compile_definitions(myapp PRIVATE "$<$<CONFIG:Debug>:MY_OPTION_FOR_DEBUG>" "DEFINE_CMDLINE_SIGNAL=void cmdlineSignal(const QMap<int, int> &i)" "$<$<BOOL:TRUE>:DEFINE_CMDLINE_SIGNAL_IN_GENEX=void cmdlineSignal(const QMap<int$<COMMA> int$<ANGLE-R> &i)>")
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.