尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

VS2015 + Qt 5.14.2 环境搭建实战:老项目编译配置与排坑指南

VS2015 + Qt 5.14.2 环境搭建实战:老项目编译配置与排坑指南 最近接到一个老工业软件项目的维护任务需求书里写得清清楚楚界面库锁定 Qt 5.14.2编译链锁定 Visual Studio 2015系统环境是 Windows 10。这种看似“过时”的组合在一线开发里其实一点也不罕见尤其是涉及第三方硬件 SDK、设备厂商提供的静态库或者要维护五六年前遗留代码的时候工具链根本动不了。我花了整整一天把 VS2015 Qt 5.14.2 从安装、配置到跑通第一个窗口程序完整折腾了一遍中间踩了不少坑整理成这篇文章给同样被困在这套组合里的朋友一个可以直接照着抄的流程。文章不只写“下一步点哪里”更会把每一步背后的版本匹配、ABI 兼容、插件原理讲清楚。适合手里攥着老 Qt 工程、不得不留在 VS2015 上编译的开发者也适合想在自己 Win10 机器上搭建一套稳定 Qt 开发环境的学习者。1. 这个组合凭什么还值得折腾1.1 不是怀旧是项目把工具链锁死了很多人第一反应是都什么年代了还用 VS2015说实话如果不是项目锁死我也不想碰这个老家伙。但现实是工业软件、医疗设备、嵌入式上位机这类领域里大量第三方 SDK 是用旧版 MSVC 编译的底层库的 C ABI、运行库依赖都绑定在旧工具链上。你拿 VS2022 去打开一个 v140(Visual Studio 2015) 的工程VS 会提示“是否升级”一旦点确认整个项目的平台工具集、Windows SDK 版本、甚至一些第三方 lib 的引用方式都可能被改写轻则编译警告一堆重则直接链接失败。对于没有源代码、只有编译好的 lib 和 dll 的封闭 SDK升级 VS 版本就等于报废。Qt 这边的选择逻辑也类似。Qt 5.14.2 是 Qt 5 分支里生命周期很稳定的一个版本也是官方最后一个支持 Windows 7 的版本。很多老项目当初选型时就锁定了它因为要兼容现场那些还在跑 Win7 的工控机。哪怕你现在是 Win10 环境开发也建议保持和现场一致的 Qt 版本避免高版本 Qt 引入新的运行库依赖导致部署时现场环境跑不起来。所以这套组合的真正价值在于它是老项目的“最小可行环境”装好了就能稳定编译、稳定部署不折腾、不升级、不引入变量。1.2 版本匹配那点事msvc2015、v140 与 Qt 库的关系Qt 在 Windows 上按编译器分了好几种编译套件比如 msvc2015、msvc2017、msvc2019、MinGW 等。你下载 Qt 安装包时看到的“MSVC 2015 64-bit”特指用 Visual Studio 2015 的编译器编出来的二进制库。用 VS2015 开发 Qt 程序必须下载对应 msvc2015 的 Qt 库反过来如果你手里只有 msvc2019 的 Qt 库强行在 VS2015 里链接链接器会因为运行库版本、符号修饰规则不一致直接报错。这里有个很多新手容易混淆的点Qt 的 msvc2015 二进制套件理论上能被 VS2017、VS2019、VS2022 的新版本编译器链接使用因为微软从 VS2015 开始承诺了 C 二进制向后兼容性。但不代表可以反向使用——VS2015 的 v140 工具集去链接 msvc2017 或更高版本编译的库大概率是不行的。所以结论很简单VS2015 配 msvc2015 套件是最稳的搭配不要拿高版本 Qt 的库硬套。另外还要注意一点VS2015 的 C 标准库实现相对老旧Qt 5.14.2 官方要求至少安装 VS2015 Update 3否则部分 Qt 头文件在模板实例化阶段可能编译不过。所以装完 VS2015 第一件事就是打 Update 3 补丁这一步千万别省。2. 安装全流程从 VS2015 到 Qt 插件2.1 安装 VS2015组件选择与 Update 3VS2015 的社区版是免费的也够用不需要去找乱七八糟的密钥。安装方式上微软官方在线安装器早就停服了只能找离线 ISO 镜像。我用的镜像文件是vs2015.community_chs.iso解压或者挂载后直接运行vs_community.exe。安装选项这里要注意不必全选桌面 C 开发只需要四类组件Visual C(也就是 VC 2015 x86/x64 编译器与库必选)Windows 8.1 SDK 和 Windows 10 SDK(建议都选后面 Qt Creator 的调试器 cdb 会用到 Windows SDK 的 Debugging Tools)通用 Windows 平台开发工具里的“适用于桌面的 VC 工具集”(如果只需要传统 Win32/Qt 界面非必选但选了无妨)首次安装完成后记得进入“控制面板-卸载程序”找到 VS2015 项点“更改”确认有没有把 Update 3 补丁打上。如果安装镜像本身不是 Update 3 集成版需要单独下载 VS2015 Update 3 安装包(KB3165756)。安装完 VS2015先打开一次让它完成首次启动配置、创建用户目录然后再继续装 Qt。原因后面会说Qt Creator 首启时会自动检测系统里存在的编译器VS2015 先装好检测到的概率和准确性都更高。2.2 安装 Qt 5.14.2MSVC 套件的正确姿势Qt 5.14.2 的下载和安装是这个流程里最容易踩坑的一步。很多人会去 Qt 官网下载页面找一个叫qt-opensource-windows-x86-5.14.2.exe的离线安装包装完才发现里面只有 MinGW 32 位组件压根没有 MSVC 2015 的库。这不是你点错了而是那个离线安装包本身就是 MinGW 定制版不包含 MSVC 套件。想要安装 msvc2015 套件正确的做法是用 Qt 官方在线安装器。具体流程是去 Qt 官网的 archive 目录下载qt-unified-windows-x86-3.2.3-online.exe或更高版本的在线安装器。运行安装器需要注册并登录一个 Qt 账号(官网免费注册)。登录后进入组件选择页这里不建议全选按需勾选即可组件是否必装说明Qt 5.14.2 - MSVC 2015 64-bit必选VS2015 编译链接时对应的 64 位 Qt 库Qt 5.14.2 - MSVC 2015 32-bit按需只做 32 位发布才需要Qt 5.14.2 - MinGW 7.3.0 32-bit不选用 VS 开发用不到省磁盘空间Qt 5.14.2 - Sources可选需要调试 Qt 源码时再装Tools - Qt Creator 4.11.2建议后面做环境自检会用到Tools - MinGW不选同上安装路径我建议直接用默认的C:\Qt\Qt5.14.2或者改成不带中文、不带空格的路径比如D:\Qt\Qt5.14.2。这个话题后面在 VS 插件配置部分会提到路径里有空格虽然大多数场景能处理但一旦遇到某些老旧的构建脚本会坑得你想骂人。安装完成后进入D:\Qt\Qt5.14.2\5.14.2目录可以看到msvc2015_64这样的文件夹里面就是 Qt 的 import 库、动态库、头文件以及bin目录下的 qmake、windeployqt 等工具。确认这个目录存在后续所有配置才有的放矢。2.3 配置环境变量和 VS 插件装完 Qt 之后先别急着打开 VS还有两项准备工作要做。第一项是环境变量。虽然 Qt Creator 自己会在运行时通过内部路径机制找到 Qt 库但你在 VS2015 里编译出来的 exe 在调试时是直接交给 Windows 加载器加载的Windows 的可执行文件搜索顺序只认 PATH、当前目录、应用程序目录。如果 Qt 的 bin 目录不在 PATH 里运行时会直接弹“找不到 Qt5Cored.dll”。所以建议在系统环境变量里添加新建变量QTDIR值设为D:\Qt\Qt5.14.2\5.14.2\msvc2015_64在Path变量末尾追加%QTDIR%\bin用 GUI 方式改不建议用setx命令直接追加PathWin10 的Path通常已经很长setx有 1024 字符截断问题一不留神就把原有环境变量清掉一大截这个坑我掉进去过。第二项是安装 Qt 的 Visual Studio 扩展。VS2015 对应的插件版本是qt-vsaddin-msvc2015-2.4.3.vsix在 Qt 官方 archive 页面的 tools 目录下可以找到。双击运行 vsix 文件安装器会提示选择目标 VS 实例必须勾选 Visual Studio 2015然后一路下一步。安装完成后打开 VS2015菜单栏顶部会多出一项Qt VS Tools。点击Qt VS Tools - Qt Versions在里面添加你刚才安装的 msvc2015_64 路径比如D:\Qt\Qt5.14.2\5.14.2\msvc2015_64。这一步是 VS 插件识别 Qt 版本的关键路径填错的话后面新建 Qt 项目会直接报“No Qt version found”。提示如果菜单里一直没有 Qt VS Tools先检查 vsix 是否装错实例。很多人的机器上同时装了 VS2015 和 VS2022双击 vsix 时默认装到了最新 VS 上VS2015 里自然就看不到菜单。卸载插件后用管理员身份运行 vsix在实例选择界面手动勾选 2015。3. 测试跑通先用 Qt Creator 再用 VS3.1 Qt Creator 快速验证 Qt 库正式在 VS2015 里开 QWidget 工程之前强烈建议先用 Qt Creator 跑一遍最小示例。好处是先把“Qt 库本身安装是否完好”和“VS 环境配置是否正确”这两个原本混在一起的问题拆开哪一步错了心里有数。打开 Qt Creator第一次启动会自动扫描系统已安装的编译器。进入工具 - 选项 - Kits(套件)正常情况下这里会有一个名为“Qt 5.14.2 MSVC2015 64bit”的套件编译器栏显示 Microsoft Visual C Compiler 14.0Qt 版本栏显示 5.14.2。如果套件列表是空的点“添加”手动指定 qmake 路径为D:\Qt\Qt5.14.2\5.14.2\msvc2015_64\bin\qmake.exe。这里还有一个调试器的问题。Qt Creator 默认的调试器是 GDB但 GDB 没法调试 MSVC 编译器生成的可执行文件必须用微软的 cdb 调试器。cdb 随 Windows SDK 的 “Debugging Tools for Windows” 组件一起安装。在 Qt Creator 的工具 - 选项 - 调试器 - CDB路径标签页里添加C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\cdb.exe然后在套件配置里把调试器选成这个 CDB。不配的话你在 Qt Creator 里按 F5 会报“No debugger configured”但实际上直接运行是没问题的很多人卡在这里。然后新建一个 Qt Widgets Application编译运行。如果能在屏幕上弹出空白窗口说明 Qt 5.14.2 的 msvc2015 库本身没问题VS 的 C 编译器也被 Qt Creator 正确识别了。这一步跑通后面 VS2015 里报错就能大概率定位到 VS 插件或工程配置上。3.2 VS2015 创建 Qt 项目并编译Qt Creator 自检通过后回到 VS2015 新建项目。在新建项目对话框里选择Visual C - Qt - Qt Widgets Application。如果没有这个模板说明 Qt VS Tools 插件没装好或 Qt Versions 没配置回到上一步重新排查。项目建好后细心的人会注意到解决方案里比普通 C 项目多了一个GeneratedFiles目录这是 Qt VS Tools 插件的自动产物。Qt 程序编译前要做三件预处理moc扫描头文件里的Q_OBJECT宏生成元对象代码uic把.ui界面文件编译成ui_xxx.h头文件rcc把.qrc资源文件编译成静态的二进制资源这三步在 VS2015 里全部由 Qt VS Tools 接管不需要你手动执行。你在工程文件里看到.ui文件时选中它右键属性里如果显示“自定义生成工具”且命令行包含 uic说明插件已接管生成环节没问题。这里我要特别强调一个路径问题新建项目时的解决方案路径和项目名不要有中文尽量也别有空格。Qt 的生成工具在底层会拼接一串长长的命令行路径一复杂就有概率出错。我习惯在D:\projects下建工程项目名直接叫QtTest这样的英文名省心。按 F5 或点击“本地 Windows 调试器”运行。如果前面环境变量PATH配置正确VS2015 的调试器能正常启动程序并弹出窗口。如果弹出“由于找不到 Qt5Cored.dll无法继续执行代码”回到系统环境变量里确认D:\Qt\Qt5.14.2\5.14.2\msvc2015_64\bin是否真的加进了Path添加后需要重启 VS2015 才会重新加载环境变量。3.3 一个够用的示例代码与部署为了验证信号槽机制在这个组合下能正常工作写一个带按钮的弹窗示例。代码不长但覆盖了Q_OBJECT、信号槽连接、字符串字面量编码这几个 Qt 开发基本功// dialog.h #ifndef DIALOG_H #define DIALOG_H #include QDialog class QPushButton; class Dialog : public QDialog { Q_OBJECT public: explicit Dialog(QWidget *parent nullptr); private slots: void onBtnClicked(); private: QPushButton *m_btn; }; #endif// dialog.cpp #include dialog.h #include QPushButton #include QMessageBox Dialog::Dialog(QWidget *parent) : QDialog(parent) { m_btn new QPushButton(QStringLiteral(点我测试), this); connect(m_btn, QPushButton::clicked, this, Dialog::onBtnClicked); } void Dialog::onBtnClicked() { QMessageBox::information(this, QStringLiteral(提示), QStringLiteral(Qt 5.14.2 VS2015 跑通了)); }// main.cpp #include dialog.h #include QApplication int main(int argc, char *argv[]) { QApplication a(argc, argv); Dialog w; w.show(); return a.exec(); }在 VS2015 里直接把这三个文件放进 Qt Widgets 工程模板对应的文件位置编译运行点击按钮看到信息框说明从 Qt 库到 VS 插件到编译器整条链路全部打通。如果以后要把程序发布到没有安装 Qt 的机器上要用 Qt 自带的部署工具把依赖 dll 全部拷到 exe 目录cd /d D:\build\release D:\Qt\Qt5.14.2\5.14.2\msvc2015_64\bin\windeployqt.exe myapp.exe运行完windeployqt后exe 目录下会多出platforms、styles等子目录以及一堆 Qt 动态库整个目录拷到目标机器就能运行。这里有个细节发布部署时千万不要用带 d 后缀的 Debug 版 dll比如Qt5Cored.dll是调试版发布版应该是Qt5Core.dll。debug 和 release 的库混用轻则程序启动闪退重则内存崩溃特别难排查。4. 高频报错与排查速查表4.1 编译期错误编译期报错是这套组合下最常遇到的问题大多数集中在“Qt 工具没跑”和“工程配置不对”两类。报错找不到 ui_Dialog.h。这个非常常见。原因通常是.ui文件没有触发 uic 工具或者.ui文件被加入了项目但没有被识别为 Qt 的 UI 文件。在 VS2015 里右键.ui文件选属性查看“常规-项类型”如果是“Qt 元数据”或“自定义生成工具”则正常如果显示“C/C 头文件”这种类型说明插件没接管把项类型改回 Qt 相关类型重新生成。报错LNK2005 或 LNK1104 无法打开 Qt5Cored.lib。先说 LNK1104多半是 Qt Versions 里配置的 Qt 路径不对或者 lib 目录没有正确传给链接器。打开“项目属性-链接器-常规-附加库目录”看是否包含D:\Qt\Qt5.14.2\5.14.2\msvc2015_64\lib。Qt VS Tools 如果配置正确会自动注入但如果之前手动改过工程文件可能就丢了需要手动补回去。报错error C2039 “pointer” 不是 “std::filesystem” 的成员。VS2015 的 C17 支持不完整std::filesystem在 VS2015 Update 2 之前就没法用即使打了 Update 3也建议用std::experimental::filesystem或者干脆用 Qt 自己的QDir、QFileInfo。在 Qt 项目里能用 Qt 封装的文件操作接口就别折腾标准库的文件系统功能了避免跨编译器的兼容性问题。4.2 运行期错误报错由于找不到 Qt5Cored.dll 或 Qt5Core.dll无法继续执行代码。这个上面提到过先查系统环境变量Path有没有msvc2015_64\bin。注意改完环境变量必须重启 VS2015光重启程序不行。如果确认Path没问题再用依赖工具(比如 Dependencies 或 Process Explorer)检查 exe 是不是被 32 位和 64 位库混用了。Qt 安装了两个套件(msvc2015 和 msvc2015_64)时最容易混打开 VS 的解决方案平台确认是 x64不要 Win32 下链接 64 位 Qt 库。报错程序启动后窗口一闪而过没有任何提示。一般发生在运行 Release 版且没有把Qt5Core.dll等动态库放到 exe 目录、也没配环境变量时。也有可能是缺少platforms\qwindows.dll这种情况下程序会在QApplication构造时静默退出用 windeployqt 部署一下就能解决。现象Debug 模式能跑Release 模式一堆链接错误。最常见的坑是只安装了 Debug 版需要的 Qt 库或者 Release 工程配置里没有指定 release 版的 Qt lib。Qt 的库分 debug 和 release 两套文件名只差一个 d 后缀但在链接器上下文里debug 工程默认找带 d 的release 工程找不带 d 的。如果你只把 Debug 版本配置好了Release 配置里的“附加依赖项”还留着一堆带 d 后缀的库名就会链接失败。4.3 工具链共存与版本混用的坑VS2015 与 VS2022 能不能共存。能而且可以装在同一台机器上互不干扰。它俩的 VS 实例目录不同MSVC 工具集目录也分开也就不会互相覆盖。需要注意的只有两点一是安装顺序建议先装 VS2015 再装 VS2022避免新版安装器的共享组件变更影响旧版工具集二是 VS2022 安装器在卸载或修改组件时不要把“MSVC v140 工具集”这类共享项误删掉。如果你在 VS2022 里打开一个 v140 工程系统提示要升级建议先复制一份工程再升级原版保留在 v140 工具集下维护。Qt 5.14.2 的 msvc2015 套件被 VS2019/VS2022 使用。理论上可行微软保持了 VS2015 以来的二进制兼容性Qt 官方在发布时也说明 msvc2015 二进制可以被新版 MSVC 链接。但遇到个别 STL 头文件版本差异导致的编译问题时要冷静优先检查是不是_ITERATOR_DEBUG_LEVEL、运行库/MD与/MT这些选项不匹配而不是急着换 Qt 套件。毕竟编不过的问题比运行期莫名其妙崩溃要好定位得多。下面把常见的报错现象、原因、处理方式汇总成一张速查表建议直接截图保存现象可能原因处理方式VS 菜单里没有 Qt VS Toolsvsix 装到了别的 VS 实例用管理员身份重装插件手动勾选 VS2015新建项目模板里没有 QtQt Versions 没配置或插件没加载检查 Qt VS Tools 菜单是否出现配置 Qt 版本路径编译报错找不到 ui_xxx.huic 未运行或 .ui 文件类型不对检查 .ui 文件项类型重新生成项目LINK1104 无法打开 Qt5Cored.libQt lib 目录未传给链接器检查附加库目录是否指向 msvc2015_64\lib运行报缺少 Qt5Cored.dllPATH 里没有 Qt bin 目录添加环境变量后重启 VS运行一闪而过缺少 platforms/qwindows.dll用 windeployqt 部署依赖链接错误 LNK2005debug/release 库混用或 /MD 与 /MT 冲突统一运行库选项使用与工程版本一致的 Qt 库找不到 Q_OBJECT 的 vtablemoc 没有运行检查头文件是否加入工程确认插件接管 Q_OBJECT 处理Qt Creator 无法调试 MSVC 程序未配置 CDB 调试器安装 Windows SDK Debugging Tools并配置 CDB 路径最后补充一个我常用的判断逻辑遇到编译问题先分清楚是“Qt 工具链没跑”还是“VS 工具链没跑”。把.ui文件删除、.qrc文件删除、甚至把#include QApplication临时注释掉如果这时候 C 错误还在说明是 VS 端配置问题如果错误只在包含 Qt 头文件或使用 Qt 宏时才出现那大概率是 Qt 插件或 Qt 路径问题。这套二分定位法比盯着报错日志瞎猜高效得多。这套 VS2015 Qt 5.14.2 的老组合这几年我在几个项目上反复用最大的感受是版本虽老但生态稳定官方文档和 Stack Overflow 上积累的踩坑记录足够多遇到问题基本都能搜到答案。如果你跟我一样被迫留在这个工具链上不妨先把环境变量、Qt Versions 路径、插件版本这三样基础检查好一半的问题都能提前消掉。后面再碰到具体报错照着上面的速查表处理就行。
返回列表