qt_wrap_cpp
Creates .moc files from sources.
The command is defined in the Core
component of the Qt6
package, which can be loaded like so:
find_package(Qt6 REQUIRED COMPONENTS Core)
This command was introduced in Qt 5.0.
Synopsis
qt_wrap_cpp
supports two signatures. The first signature was added in Qt 6.8 and has the following form:
qt_wrap_cpp(<TARGET> src_file1 [src_file2 ...] [OPTIONS ...] [DEPENDS ...])
Note: The signature above is recommended over the older signature.
qt_wrap_cpp(<VAR> src_file1 [src_file2 ...] [TARGET target] [OPTIONS ...] [DEPENDS ...])
If versionless commands are disabled, use qt6_wrap_cpp()
instead. It supports the same set of arguments as this command.
Description
Creates rules for calling the Meta-Object Compiler (moc) on the given source files. For each input file, an output file is generated in the build directory. The paths of the generated files are added to <VAR>
.
Note: This is a low-level macro. See the CMake AUTOMOC Documentation for a more convenient way to let source files be processed with moc
.
Arguments
You can set an explicit TARGET
. This will make sure that the target properties INCLUDE_DIRECTORIES
and COMPILE_DEFINITIONS
are also used when scanning the source files with moc
.
Since Qt 6.8, when a source file is passed to qt_wrap_cpp
instead of a header file to generate a .moc
file for a target, the TARGET
parameter is needed to set the correct include path for the generated .moc
file in the source file. As generated .moc
files are added to the target's sources by qt_wrap_cpp
, they are not added to <VAR>
.
You can set additional OPTIONS
that should be added to the moc
calls. You can find possible options in the moc documentation.
The OPTIONS
can evaluate generator expressions when TARGET
is set.
Note: If the OPTIONS
include both generator expressions and special characters, use variables to implement them. For example, use $<ANGLE-R>
, $<COMMA>
and $<SEMICOLON>
instead of >
, ,
and :
. Otherwise, the generator expression will not be evaluated correctly. OPTIONS
are wrapped in generator expressions, so you must escape special characters in them.
DEPENDS
allows you to add additional dependencies for recreation of the generated files. This is useful when the sources have implicit dependencies, like code for a Qt plugin that includes a .json
file using the Q_PLUGIN_METADATA() macro.
Examples
Since 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"
In the above file, myapp.moc
is included in myapp.cpp
. To generate the myapp.moc
file, the qt_wrap_cpp
macro is used with the TARGET
parameter. The .moc
file and its path will be added to the target's sources and include directories by the qt_wrap_cpp
macro.
The old version:
set(SOURCES myapp.cpp main.cpp) qt_wrap_cpp(SOURCES myapp.h) qt_add_executable(myapp ${SOURCES})
In the following example, the generator expressions passed to OPTIONS
will be evaluated since TARGET
is set. The argument is specified this way to avoid syntax errors in the generator expressions.
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})
The following example uses target_compile_definitions to set COMPILE_DEFINITIONS which will be added to 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)>")