Waf Unity构建模式下Qt moc生成未触发问题咨询
解决Waf Unity构建下Qt5 Moc不触发的问题
问题根源
Unity构建会将多个源文件合并为单个unity文件,但Waf默认的unity插件不会自动关联Qt5的moc处理逻辑——Qt5插件原本是针对单个源/头文件触发moc生成,合并后单个文件的处理流程被跳过,导致moc未执行。
解决方案
方案1:显式指定Moc依赖并纳入Unity构建
在wscript的构建目标中,手动指定需要moc的头文件,并确保生成的moc文件被加入构建源:
def build(bld): bld( features='qt5 unity cxx cxxshlib', source=['src/main.cpp', 'src/widget.cpp'], includes='.', target='myqtlib', # 明确列出需要生成moc的头文件 qt5_moc_headers=['src/widget.h'], # 强制将生成的moc文件加入构建流程 use_moc=True )
方案2:补丁Unity插件的节点创建逻辑
通过重写Unity插件的create_unity_nodes函数,让它在生成unity文件前先触发Qt5的moc处理:
from waflib.Tools import unity # 保存原函数 original_create_unity = unity.create_unity_nodes def patched_create_unity(self): # 如果目标包含qt5功能,先执行moc处理 if 'qt5' in self.features: self.moc_process() return original_create_unity(self) # 替换原函数 unity.create_unity_nodes = patched_create_unity def build(bld): bld( features='qt5 unity cxx cxxshlib', source=['src/main.cpp', 'src/widget.cpp', 'src/widget.h'], includes='.', target='myqtlib' )
注意事项
- 确保生成的moc文件路径正确,Unity构建能正常找到这些文件
- 若有多个需要moc的头文件,需全部列入
qt5_moc_headers列表
内容的提问来源于stack exchange,提问作者dbn
相关产品推荐
相关产品推荐

