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
在 Version 或 Qt 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 和运行时资源。