QT自动生成的Makefile中moc、rcc、uic调用位置咨询
关于qmake生成的Makefile中moc/rcc/uic规则的疑问解答
嘿,这个问题我刚接触Qt的时候也琢磨过好一阵!其实它们的规则并没有“消失”,只是藏在了qmake生成的子Makefile或者依赖文件里,而且只有在你项目需要用到这些工具的时候才会出现,具体来说:
规则的存放位置:qmake不会把所有构建规则都塞到顶层的
Makefile里,而是会把平台、编译模式(Debug/Release)相关的规则拆分到Makefile.Debug、Makefile.Release这类子文件中,另外一些自动生成的依赖文件(比如.d后缀的文件)或者.qmake.stash里也可能包含这些工具的调用逻辑。你可以打开这些子文件看看,就能找到对应的moc/uic/rcc命令了。触发条件:如果你的最小项目只是一个简单的
main.cpp,没有使用Q_OBJECT宏、.ui界面文件或者.qrc资源文件,那qmake根本不会生成这些工具的调用规则——毕竟没这个需求嘛!比如只有当你的头文件里加了Q_OBJECT(需要moc处理信号槽元信息)、项目里有.ui文件(需要uic转成cpp代码)、或者有资源文件(需要rcc打包)时,对应的构建规则才会被qmake写入到子Makefile中。快速验证方法:你可以给项目加一个带
Q_OBJECT的类试试:- 新建一个
mywidget.h,写一个继承QWidget的类,加上Q_OBJECT宏; - 把这个头文件添加到
.pro文件里(或者重新执行qmake -project); - 再次执行
qmake生成新的Makefile;
这时候你打开Makefile.Debug或者Makefile.Release,就能找到生成moc_mywidget.cpp的规则,以及把这个文件编译链接到最终程序里的步骤了。
- 新建一个
隐式执行逻辑:Make工具会通过依赖检查自动触发这些工具——比如当你修改了带
Q_OBJECT的头文件,Make会检测到依赖变化,自动调用moc生成对应的cpp文件,再编译它,整个过程不需要你手动调用这些工具,这也是Qt官方说“无需直接使用moc”的原因。
内容的提问来源于stack exchange,提问作者Roman




