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)的规则。对于每个输入文件,将在构建目录中生成一个输出文件。
使用基于目标的签名时,生成的文件将作为源文件添加到<TARGET> 中。使用旧版签名时,生成的文件路径将被添加到<VAR> 中。
注意:这是一个 低级宏。有关让源文件通过moc 进行处理的更便捷方法,请参阅CMake AUTOMOC 文档。
参数
您可以显式设置TARGET 。这将确保在使用moc 扫描源文件时,目标属性INCLUDE_DIRECTORIES 和COMPILE_DEFINITIONS 也会被使用。
自 Qt 6.8 起,当向 `qt_wrap_cpp ` 传递源文件(而非头文件)以生成目标的 `.moc ` 文件时,需要通过 `TARGET ` 参数为源文件中生成的 `.moc ` 文件设置正确的包含路径。
如果您在与目标目录作用域不同的目录作用域中调用 `qt_wrap_cpp `,则必须使用 `qt_wrap_cpp ` 的基于目标的签名,或者通过 `TARGET ` 参数传递目标。
您可以设置应添加到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 文件,需使用qt_wrap_cpp 宏并传入TARGET 参数。.moc 文件及其路径将通过qt_wrap_cpp 宏添加到目标的源代码和包含目录中。
旧版本:
set(SOURCES myapp.cpp main.cpp)
qt_wrap_cpp(SOURCES myapp.h)
qt_add_executable(myapp ${SOURCES})在下面的示例中,由于已设置TARGET ,因此传递给OPTIONS 的生成器表达式将被求值。以这种方式指定参数是为了避免生成器表达式中的语法错误。
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)>")© 2026 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.