如何通过qmake/moc向Qt的moc_predefs.h添加自定义预定义宏?
解决Qt moc_predefs.h添加专属自定义宏的问题
刚好碰到过类似的需求——要给moc单独加宏屏蔽第三方头,又不想影响编译或者膨胀Makefile。这里有两个靠谱的方案,看你的场景选:
方案1:用-include指定专属头文件(推荐)
这是最干净的方式,既能让宏像在moc_predefs.h里一样提前生效,又完全不影响正常编译流程:
- 先创建一个专门的头文件,比如
moc_custom_defs.h,放在你的项目目录下,把需要的保护宏写进去:
// moc_custom_defs.h // 屏蔽boost被moc解析的保护宏 #define BOOST_SOME_GUARD_MACRO 1 // 或者直接禁用boost的某些moc敏感部分 #define BOOST_NO_MEMBER_TEMPLATES
- 在你的
.pro文件里添加一行,告诉moc在处理所有文件前先包含这个头:
QMAKE_MOC_FLAGS += -include $$PWD/moc_custom_defs.h
这样moc在生成代码时,会自动把这个头的内容当作预定义宏的一部分(效果等同于写在moc_predefs.h里),而且这个-include参数只会传给moc,你的C++编译器完全不会读到这些宏,完美隔离了moc和编译流程。
方案2:针对moc单独加-D参数(适合少量宏)
如果你的保护宏只有一两个,也可以直接给moc加-D参数,但用QMAKE_MOC_FLAGS而不是QMAKE_MOC:
QMAKE_MOC_FLAGS += -DBOOST_NO_MOC_PARSING=1
相比直接修改QMAKE_MOC,QMAKE_MOC_FLAGS会把参数统一整理,不会让Makefile里的moc调用行变得杂乱不堪,膨胀程度小很多。
为什么不推荐其他方式?
- 用
QMAKE_CXXFLAGS += -Dxxx:会让这些宏在整个编译过程中生效,可能影响第三方库的正常编译,不符合你“仅作用于moc”的需求。 - 手动修改生成的moc_predefs.h:每次qmake重新生成或者清理项目后,修改就没了,完全不可靠。
内容的提问来源于stack exchange,提问作者Jaa-c
相关产品推荐
相关产品推荐

