You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 09:47:05