【 VS2013 集成 Qt5.7.1 踩坑记录:moc/uic/rcc 报“系统找不到指定的路径”怎么解决?】

VS2013 集成 Qt5.7.1 踩坑记录:moc/uic/rcc 报"系统找不到指定的路径"怎么解决?

最近在维护一个比较老的 Windows 客户端项目,环境是 Visual Studio 2013 + Qt 5.7.1 + CEF。本来以为只是简单配置一下 Qt VS Tools,结果刚打开项目重新生成,就遇到了一个非常典型的老环境问题:

text 复制代码
Moc'ing xxx.h...
系统找不到指定的路径。

Moc'ing xxx.h...
系统找不到指定的路径。

Uic'ing xxx.ui...
系统找不到指定的路径。

Uic'ing xxx.ui...
系统找不到指定的路径。

Rcc'ing xxx.qrc...
系统找不到指定的路径。

error MSB6006: "cmd.exe"已退出,代码为 3。

一开始很容易误以为是代码问题,或者是 CEF 没有配置好。但实际排查下来发现,这个错误和 CEF 没什么关系,甚至还没有真正进入 C++ 编译阶段。问题出在 VS2013 调用 Qt 的 moc/uic/rcc 工具时,路径解析失败或者工具找不到

这篇文章记录一下 VS2013 集成 Qt5.7.1 的完整配置过程,以及这个问题的解决方法。


一、当前环境

我的环境大概是这样的:

text 复制代码
Visual Studio 2013
Qt 5.7.1
Qt VS Tools
Qt 编译器版本:msvc2013
项目类型:Qt + C++ 项目
后续需要集成:CEF

Qt 安装目录示例:

text 复制代码
C:\Qt\Qt5.7.1\5.7\msvc2013

这个目录下面应该能看到这些文件夹:

text 复制代码
bin
include
lib
mkspecs
plugins

其中 bin 目录非常关键,里面有:

text 复制代码
moc.exe
uic.exe
rcc.exe
qmake.exe

这几个工具是 Qt 项目编译时必须用到的。


二、先理解 moc/uic/rcc 是什么

Qt 项目和普通 C++ 项目不太一样,它在真正编译 C++ 代码之前,还需要先生成一些中间文件。

比如:

text 复制代码
moc.exe:处理带 Q_OBJECT 的头文件,生成 moc_xxx.cpp
uic.exe:处理 .ui 界面文件,生成 ui_xxx.h
rcc.exe:处理 .qrc 资源文件,生成 qrc_xxx.cpp

所以当你看到:

text 复制代码
Moc'ing xxx.h
Uic'ing xxx.ui
Rcc'ing xxx.qrc

说明项目还处在 Qt 自动生成阶段。

如果这个阶段报错,通常不是业务代码写错了,而是 Qt 工具路径、项目路径、生成目录出了问题。


三、配置 Qt VS Tools

安装好 Qt VS Tools 之后,打开 VS2013,菜单栏应该能看到:

text 复制代码
QT VS TOOLS

如果菜单能看到,说明插件基本装好了。

接下来先配置 Qt 版本。

点击:

text 复制代码
QT VS TOOLS -> Qt Options

添加 Qt 路径:

text 复制代码
C:\Qt\Qt5.7.1\5.7\msvc2013

注意,这里不要选错。

不要填成:

text 复制代码
C:\Qt
C:\Qt\Qt5.7.1
C:\Qt\Qt5.7.1\5.7
C:\Qt\Qt5.7.1\5.7\msvc2013\bin

正确的路径应该是包含 bin/include/lib/mkspecs/plugins 的那个目录。

可以给这个 Qt 版本命名为:

text 复制代码
msvc2013

四、绑定项目的 Qt 版本

Qt Options 配好之后,还要给当前项目绑定 Qt 版本。

点击:

text 复制代码
QT VS TOOLS -> Qt Project Settings

VersionQt Version 里选择:

text 复制代码
msvc2013

即使它已经显示是 msvc2013,也建议重新手动选择一次。因为有时候项目本地配置缓存会失效,看起来选中了,实际没有生效。

然后切换到:

text 复制代码
Qt Modules

至少勾选:

text 复制代码
Core
Gui
Widgets

如果项目中用到了网络相关功能,再勾选:

text 复制代码
Network

对于普通 Qt 窗口程序来说,最基础的一般就是:

text 复制代码
QtCore
QtGui
QtWidgets

五、最容易忽略的一步:配置系统 Path

这次问题的关键点就在这里。

虽然 Qt VS Tools 里已经配置了 Qt 路径,但是在 CMD 里输入:

cmd 复制代码
moc
uic
rcc

结果全部提示:

text 复制代码
'moc' 不是内部或外部命令,也不是可运行的程序或批处理文件。
'uic' 不是内部或外部命令,也不是可运行的程序或批处理文件。
'rcc' 不是内部或外部命令,也不是可运行的程序或批处理文件。

这说明 Windows 的系统环境变量里没有 Qt 的 bin 目录。VS2013 在调用这些工具时,也可能因为找不到路径而失败。

解决方法是把下面这个路径加入系统 Path:

text 复制代码
C:\Qt\Qt5.7.1\5.7\msvc2013\bin

操作步骤如下。

按:

text 复制代码
Win + R

输入:

text 复制代码
sysdm.cpl

回车。

然后进入:

text 复制代码
高级 -> 环境变量

在下面的:

text 复制代码
系统变量

中找到:

text 复制代码
Path

点击:

text 复制代码
编辑 -> 新建

添加:

text 复制代码
C:\Qt\Qt5.7.1\5.7\msvc2013\bin

保存后,一定要关闭当前 CMD 和 VS2013,然后重新打开。

重新打开 CMD 后验证:

cmd 复制代码
moc -v
uic -v
rcc -v

如果能输出版本信息或帮助信息,就说明环境变量生效了。

如果还是提示"不是内部或外部命令",可以直接重启电脑再试。


六、项目路径必须纯英文

这是 VS2013 + Qt5.7.1 这种老组合里非常常见的坑。

项目路径不要包含:

text 复制代码
中文
空格
特殊符号

不推荐放在:

text 复制代码
D:\学习\Qt项目\ExampleProject
D:\软件包\编程\ExampleProject
D:\Example Project
D:\Project#1\ExampleProject

建议放在:

text 复制代码
D:\Code\ExampleProject
D:\Projects\ExampleProject
C:\Code\ExampleProject

老版本 VS、Qt VS Tools、MSBuild 对中文路径和特殊字符的兼容性并不好。尤其是在调用 cmd.exe 执行 moc/uic/rcc 的时候,很容易出现路径解析失败,最后表现为:

text 复制代码
系统找不到指定的路径
MSB6006: cmd.exe 已退出,代码为 3

所以遇到这个问题时,不要一上来就怀疑代码,先把项目移动到纯英文路径。


七、清理项目缓存

如果 Qt Options、系统 Path、项目路径都处理好了,仍然报错,可以清理一下 VS 和 Qt 生成的缓存。

关闭 VS2013,然后删除项目目录下的:

text 复制代码
*.user
*.sdf
ipch

其中:

text 复制代码
*.user:VS 本地用户配置
*.sdf:VS IntelliSense 数据库
ipch:VS 预编译智能感知缓存

删除后重新打开 .sln,再进入:

text 复制代码
QT VS TOOLS -> Qt Project Settings

重新选择:

text 复制代码
msvc2013

然后执行:

text 复制代码
生成 -> 清理解决方案
生成 -> 重新生成解决方案

八、常见错误对应原因

1. 找不到 QApplication

如果报:

text 复制代码
fatal error C1083: 无法打开包括文件: "QApplication": No such file or directory

一般是 Qt include 路径没有配置好。

重点检查:

text 复制代码
QT VS TOOLS -> Qt Options

确认路径是:

text 复制代码
C:\Qt\Qt5.7.1\5.7\msvc2013

再检查:

text 复制代码
QT VS TOOLS -> Qt Project Settings

确认项目绑定的是:

text 复制代码
msvc2013

并且 Qt Modules 勾选了:

text 复制代码
Core
Gui
Widgets

2. moc/uic/rcc 报"系统找不到指定的路径"

如果报:

text 复制代码
Moc'ing xxx.h...
系统找不到指定的路径。

常见原因有:

text 复制代码
Qt bin 没加入系统 Path
项目路径包含中文、空格、特殊符号
Qt Project Settings 绑定失效
.vcxproj 中引用的 .h/.ui/.qrc 文件路径不存在

建议按这个顺序处理:

text 复制代码
1. 把项目移动到纯英文路径,例如 D:\Code\ExampleProject
2. 添加 C:\Qt\Qt5.7.1\5.7\msvc2013\bin 到系统 Path
3. 关闭并重新打开 CMD 和 VS2013
4. 在 CMD 中验证 moc/uic/rcc 是否可用
5. 删除 *.user、*.sdf、ipch 等 VS 本地缓存文件
6. 重新选择 Qt Project Settings 中的 msvc2013
7. 清理并重新生成

3. MSB6006: cmd.exe 已退出,代码为 3

这个错误一般不是根因,而是结果。

真正的错误通常在它前面,比如:

text 复制代码
系统找不到指定的路径

所以看到:

text 复制代码
error MSB6006: "cmd.exe"已退出,代码为 3

不要只盯着 cmd.exe,要往上翻,看第一条真正的错误信息。


九、推荐的完整配置顺序

如果是刚安装 VS2013 + Qt5.7.1,建议按下面顺序配置:

text 复制代码
1. 安装 VS2013

2. 安装 Qt 5.7.1 msvc2013

3. 安装 Qt VS Tools

4. 打开 VS2013,确认菜单栏有 QT VS TOOLS

5. 配置:
   QT VS TOOLS -> Qt Options
   添加:
   C:\Qt\Qt5.7.1\5.7\msvc2013

6. 配置系统环境变量 Path,添加:
   C:\Qt\Qt5.7.1\5.7\msvc2013\bin

7. 重新打开 CMD,验证:
   moc -v
   uic -v
   rcc -v

8. 把项目放到纯英文目录,例如:
   D:\Code\ExampleProject

9. 打开项目 .sln

10. 配置:
    QT VS TOOLS -> Qt Project Settings
    Version 选择:
    msvc2013

11. Qt Modules 勾选:
    Core
    Gui
    Widgets

12. 删除缓存:
    *.user
    *.sdf
    ipch

13. 重新打开 VS2013

14. 生成 -> 清理解决方案

15. 生成 -> 重新生成解决方案

十、集成 CEF 前,先确保 Qt 能单独跑起来

很多人一上来就想把 Qt 和 CEF 一起配好,但这样排错会非常痛苦。

正确顺序应该是:

text 复制代码
1. 先让 Qt 项目能正常编译
2. 让一个最小 QApplication + QWidget 窗口跑起来
3. 再添加 CEF include/lib
4. 再处理 libcef.dll 等运行时文件
5. 最后写 CEF 初始化代码

可以先用下面这个最小程序测试 Qt 环境:

cpp 复制代码
#include <QApplication>
#include <QWidget>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QWidget w;
    w.resize(800, 600);
    w.setWindowTitle("Qt VS2013 Test");
    w.show();

    return app.exec();
}

如果这个最小程序都编译不过,就说明 Qt 环境还没配置好,不要急着处理 CEF。


十一、总结

这次问题看起来是:

text 复制代码
系统找不到指定的路径
MSB6006: cmd.exe 已退出,代码为 3

但本质上是 VS2013 在调用 Qt 的 moc/uic/rcc 工具时失败了。

排查过程中,在 CMD 中执行:

cmd 复制代码
moc
uic
rcc

全部提示不是内部或外部命令,所以可以确认至少有一个问题:

text 复制代码
Qt 的 bin 目录没有加入系统 Path

最终需要添加:

text 复制代码
C:\Qt\Qt5.7.1\5.7\msvc2013\bin

到系统环境变量。

同时,VS2013 + Qt5.7.1 是比较老的组合,项目路径一定要尽量保持纯英文、无空格、无特殊字符。推荐使用类似路径:

text 复制代码
D:\Code\ExampleProject

一句话总结:

先保证 Qt Options 配对,再保证 Qt bin 在 Path 里,最后保证项目路径纯英文。只有 moc/uic/rcc 阶段正常通过,后面才轮到处理 CEF 的 include、lib、dll 和运行时资源。

相关推荐
石山代码1 小时前
c++类型判断
开发语言·c++
froginwe111 小时前
传输对象模式
开发语言
Hello:CodeWorld1 小时前
μC/OS vs FreeRTOS:嵌入式实时操作系统深度对比
c语言·开发语言·单片机
绝世唐门三哥1 小时前
ES6 --- import/export 全解析
开发语言·前端·javascript
yqcoder1 小时前
JavaScript 异步基石:Promise 完全指南
开发语言·前端·javascript
wangl_921 小时前
初探 C# 15 的 Union Types
java·开发语言·算法·c#·.net·.net core
故事和你911 小时前
洛谷-【图论2-1】树2
开发语言·数据结构·c++·算法·动态规划·图论
折哥的程序人生 · 物流技术专研2 小时前
Java面试85题图解版 · 全系列总目录
java·开发语言·后端·面试·职场和发展
gf13211112 小时前
飞书长连接_事件订阅(接收消息,审批任务状态变更)
开发语言·python·飞书