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

从QMake迁移到CMake后遇Qt槽函数未定义引用链接错误

Qt QMake转CMake后私有槽函数链接报错问题

问题描述

将Qt项目从QMake迁移到CMake,使用qmake2cmake脚本生成初始CMakeLists.txt,编译环节正常,但链接阶段出现未定义引用错误:

/usr/bin/ld: ... undefined reference to GerberStencilGenerator::afterWindowIsShown()

该函数为主类的私有槽函数,确实存在且在QMake环境下可正常编译链接,怀疑MOC编译环节出现问题但无法准确定位。

排查与解决步骤

1. 验证Q_OBJECT宏与MOC扫描

  • 确认包含槽函数的头文件中存在Q_OBJECT宏,且该头文件被CMake的MOC工具正确扫描。
  • 检查构建目录下的MOC生成文件(如CMakeFiles/[项目名]_autogen/include或mocs_compilation.cpp),确认其中包含GerberStencilGenerator::afterWindowIsShown()的MOC代码。若缺失,说明CMake未识别到该头文件需要MOC处理。

2. 修正CMakeLists.txt的源文件配置

  • 使用qt_add_executable时,务必将包含槽函数的头文件添加到目标源文件列表:
    qt_add_executable(GerberStencilGenerator
        main.cpp
        gerberstencilgenerator.h
        gerberstencilgenerator.cpp
    )
    
  • 若手动管理MOC,需用qt_wrap_cpp明确指定需要处理的头文件:
    qt_wrap_cpp(MOC_SOURCES gerberstencilgenerator.h)
    add_executable(GerberStencilGenerator main.cpp gerberstencilgenerator.cpp ${MOC_SOURCES})
    

3. 检查槽函数的声明与实现一致性

  • 头文件中槽函数声明(确保签名无拼写错误):
    class GerberStencilGenerator : public QMainWindow
    {
        Q_OBJECT
    private slots:
        void afterWindowIsShown();
    };
    
  • 实现文件中必须匹配完整签名,且不能遗漏类名前缀:
    void GerberStencilGenerator::afterWindowIsShown()
    {
        // 函数实现代码
    }
    

4. 清理构建目录重新编译

  • 旧的MOC缓存可能引发问题,执行以下命令彻底清理后重新构建:
    rm -rf build/
    mkdir build && cd build
    cmake .. && make VERBOSE=1
    

5. 检查verbose输出中的MOC执行日志

  • 从构建的verbose输出中搜索moc相关命令,确认gerberstencilgenerator.h被MOC处理:
    /usr/lib/qt6/bin/moc -DQT_NO_DEBUG -DQT_WIDGETS_LIB ... gerberstencilgenerator.h -o CMakeFiles/GerberStencilGenerator_autogen/EWIEGA46WW/moc_gerberstencilgenerator.cpp
    
  • 若未找到该命令,说明CMake未将头文件纳入MOC处理范围,需调整源文件列表。

内容的提问来源于stack exchange,提问作者t0bias

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 06:05:56