现在新项目我基本只用VS 2022,说实话谁闲得没事去折腾Visual Studio 2015这种老古董?但上周帮朋友调试一套工厂设备的上位机,对方整套软件环境锁死了——Win10 + VS2015 + Qt 5.14.2,我被迫把这几个老家伙重新请出来。装之前我以为很简单,结果过程中连续踩了好几个坑:Qt版本装了个mingw的,VS扩展装错了版本,链接阶段报qtmaind.lib找不到……忙活了一下午才把环境彻底跑通。
这篇文章记录的,就是这次完整经历。我会从版本选择开始讲,而不是直接甩安装包链接让你一路点“下一步”。因为这套组合的问题,绝大多数都出在“选择”上:选错编译器、选错工具集、选错Qt套件,后面做再多配置都是白费。文章适合两类人:一是接手老项目,被要求在VS2015 + Qt 5.14.2环境下继续开发的工程师;二是自己学Qt,搜索教程时看到别人用这套老组合,但又不想被各种报错劝退的新手。看完你至少能搞清楚一件事:VS和Qt之间的版本关系到底是什么。
先说我的测试环境:Windows 10 21H2 64位系统,Visual Studio 2015(Update 3),Qt 5.14.2 msvc2015_64套件,Qt VS Tools扩展2.7.2版本。这套环境在Win10上能正常运行,后面也会具体说兼容性边界在哪里。
1. 为什么还在用VS 2015 + Qt 5.14.2?
1.1 这套老组合的真实定位
先说一个可能让很多人意外的事实:直到今天,依然有大量工业软件、医疗设备、传统制造企业的上位机程序,跑在VS2015 + Qt 5.14.x这个组合上。原因很简单:设备供应商的SDK只在这个环境下测试过,或者现场其他工控软件依赖了特定版本的运行时库。你用了VS2022编译出来的程序,拿到人家现场反而可能起不来。
那为什么偏偏是Qt 5.14.2?看Qt的发布历史会发现,5.14是5.12 LTS之后的一个过渡版本,但5.14.2修复了一批关键bug,尤其是和高分屏、DirectWrite以及Windows 10 1909+的兼容问题,稳定度比5.14.0好了一大截。很多企业那时候刚从5.6/5.9开始规划升级,看到5.14.2表现不错,项目一半就定在这了。所以你在2025年接手一个还在用VS2015的老项目时,Qt版本大概率就是5.12、5.14或5.15这几个之一。
1.2 为什么选用msvc2015套件而不是msvc2017或MinGW
这是新手最容易犯错的第一个点。很多人在Qt安装器里看到“msvc2015_64”“msvc2017_64”“mingw73_64”一堆选项,随手选了一个,后面编译时各种莫名其妙。
我之前见过一个新手,选了个mingw73_64编译Qt项目,但VS2015里根本没有MinGW的编译器。Qt Creator用MinGW当然行,可VS项目必须使用MSVC工具链。反过来,如果你装了Qt的msvc2015_64套件,却拿VS2022去编译,Qt官方对你说“不保证兼容”,虽然某些情况下能通过,但常见的问题是链接器版本不同导致符号差异或UCRT版本冲突。
1.3 Qt版本和VS版本是怎么对应的
这里我用最直白的方式说。Qt官方把预编译二进制分成两类,一类指定MSVC编译器,另一类指定MinGW编译器。MSVC这一类又按VS主版本区分:msvc2015、msvc2017、msvc2019。你需要根据编译器版本选对应的Qt包。严格来说,msvc2017和msvc2019的包并不完全兼容VS2015的v140工具集,因为MSVC的标准库实现细节有差异。所以稳妥方案就是:VS2015对应msvc2015,这是规则。其中msvc2015_64对应64位程序,msvc2015对应32位。
这套对应关系一定要刻进脑子里。它决定的不只是“能不能编译”,还包括能否用上官方预编译的Qt库文件,以及Debug/Release各应该配哪套依赖。
2. 安装之前,先把版本、下载和共存问题理清
2.1 检查系统版本与安装兼容性
关于Win10,微软对VS2015的官方支持路径很明确。Win10 1607等早期版本上,某些Windows SDK功能和Qt的窗口行为会有差异。为了省心,建议至少是Windows 10 1809以上的版本。我环境是21H2,测试下来没问题。如果你的机器是虚拟机或共享开发机,操作前先留意一下系统的更新级别,这一步在安装前确认好,能省掉很多后续的麻烦。
2.2 排解安装阶段的安全软件干扰
补充一句,Windows Defender实时防护或第三方杀毒软件在解包Qt大型组件时可能误报,导致安装文件损坏或扩展激活失败。这个出现的概率不高,但一旦出现就很隐蔽。碰到莫名奇妙的安装失败,可以把实时保护临时关掉再装,装完立刻打开。但不要为了省事长期关闭系统防护,得不偿失。
2.3 正确拿到VS2015安装介质
VS2015的安装文件可以从微软官网下载,建议直接用Community版,个人开发者和开源项目使用完全够用。这里我不展开讲授权细节,只想强调一点:务必安装带Update 3的版本。Update 3修复了大量Win10兼容性问题,并附带较新的Windows SDK组件。没有Update 3的话,后续在Win10上编译C++项目经常会碰到奇奇怪怪的运行时错误。
官方提供的离线ISO镜像包含安装器和全部组件,装起来最省心。如果你的电脑已经装了VS2022,先不用卸载,VS2015可以和VS2022共存。关键在安装顺序和工具集版本:先装VS2015,后装VS2022,中间的冲突最小。因为VS2022的安装器会识别已有旧版本并共享部分组件;反过来如果你装了VS2022再去装VS2015,也不是不行,但环境变量和默认C++工具链的指向会乱掉,容易造成后续命令行编译时调错编译器。我实际测试下来,先旧后新是最省心的。
2.4 Qt 5.14.2安装器的下载与路径规划
Qt的安装方式现在一律走在线安装器。官网会要求注册Qt账户,下载时会让你勾选开源协议,注意不要勾成商业协议。安装器本身不大,真正费时间的是下一步选中Qt 5.14.2套件后的下载过程,整套msvc2015_64大概是2GB左右。
我现在习惯把安装路径写成“D:\Qt\Qt5.14.2”,不建议装到带空格或中文的路径。路径里有空格虽然VS能勉强处理,但遇到一些老项目或自动化脚本时,就会出现莫名其妙的“无法打开包含文件”或“找不到Qt5Cored.dll”的坑。保持纯英文路径,这是多年Windows开发养成的习惯,放到今天一点也没有过时。
2.5 多版本VS共存:先旧后新才省心
如果你同机还需要保留VS2019或VS2022,要注意sln文件的版本。VS2015的解决方案文件格式可以被更高版本的VS打开,但高版本VS打开旧项目后,默认可能会问你“是否升级工具集”。这时候一定要选择“不升级”,保留v140工具集,否则Qt msvc2015库的二进制兼容性就被破坏了。
我在实际中见过一个很典型的情况:同事用VS2022打开了VS2015创建的Qt工程,顺手选择了“Retarget Projects”,把平台工具集改成了v143,结果编译出来一大堆链接错误。后来发现错误原因根本不是代码,而是Qt库还是msvc2015的。这种问题一旦发生,往往会被误判为Qt版本和VS不兼容,其实唯一的错误就是运行时库/工具集没对上。
3. VS2015的安装,讲究的是组件选择
3.1 自定义安装中必须勾选的组件
VS2015安装界面虽然是老式的,但选项还是要细心看。对Qt开发来说,必须要勾选的是“Visual C++”相关功能。在中文版里一般是“编程语言 -> Visual C++”,展开后建议勾选“C++工具”、“Windows 8.1 SDK”和“Windows 10 SDK”(如果安装器列出了的话)。不做UWP或Windows Store开发的话,UWP相关的组件都可以忽略。
需要特别提醒:有些系统如果没有装Windows 10 SDK,会影响Qt项目编译时对最新Windows头文件的引用,尤其是用到Win10新增API时会出现“无法打开windows.h”。Windows SDK可以在VS安装器里按需补装。这个问题我当时装的时候没注意,后来因为一个系统接口编译不过去,回头查了半天才发现是SDK缺了。
3.2 安装Update 3的坑
如果先装了VS2015原版再打Update 3,过程中可能会卡在“正在更新共享组件”这一阶段。多数情况下是网络原因,或者机器上某个组件被占用。比较有效的处理办法是用管理员身份运行安装器,并关闭正在运行的VS进程,再尝试“Repair”。
不过说实话,最稳妥的路线是直接下载带Update 3的离线ISO镜像,一次性装好。ISO里可选组件更全,包括Win10 SDK等都会一并打包。虽然下载体积较大,但省事程度比在线补丁包高得多。这也是我给企业用户的建议:不要用在线安装器去慢慢拖,直接用完整ISO镜像离线安装,速度和时间都更可控。
3.3 验证VS2015是否安装成功
安装完成后,可以这样快速验证:
- 打开Visual Studio,新建一个“Visual C++ -> Windows控制台应用程序”,直接编译运行一个Hello World。
- 确认新建项目模板列表里能看到C++相关模板,说明C++组件是完整安装的。
这一步不能省。我见过有人装完VS2015后,Qt集成搞了很久都不行,最后回头发现是VS里C++模板都没装完整。对这种基础环节的验证,越早做越好。
4. Qt 5.14.2安装:重点在套件和组件
4.1 在Qt安装器中准确选择msvc2015_64
Qt在线安装器打开后,会经过注册、登录步骤。接着进入“Select Components”,这里是关键窗口。展开Qt -> Qt 5.14.2,你会看到一堆复选框:
- msvc2015_64 —— 64位MSVC2015编译的Qt库,我们需要这个
- msvc2015 —— 32位MSVC2015编译的Qt库,做32位程序时用
- msvc2017_64 / msvc2019_64 —— 其他VS版本对应的包
- mingw73_64 —— 需要用MinGW编译器时才会选
我建议只勾选msvc2015_64,除非你确定需要32位版本,否则不要贪多。把msvc2017、msvc2019、mingw全选上的做法,除了多占磁盘和让套件列表混乱之外,没有任何好处。装完之后Qt Creator会自动扫描到msvc2015_64套件,但我们要用的是VS集成,所以先不必急着打开Qt Creator。
另外还有“Qt Debug Symbols”和“Qt Sources”可选项,普通开发不用装。如果你的生产环境需要调试Qt源码,建议把Sources勾上;Symbols一般不用,除非你要配合WinDbg做崩溃分析时才需要。
4.2 Qt的安装路径与后续工具路径
安装器会让你设置安装目录,建议写成“D:\Qt\Qt5.14.2”类似的结构。注意安装路径不要包含中文和空格,否则VS集成时解析qmake路径容易出问题。
安装完成后,Qt工具包目录会自动按版本创建,例如“D:\Qt\Qt5.14.2\5.14.2\msvc2015_64”,bin目录下的qmake.exe路径,后面配置Qt VS Tools时要手工指定一次,这个位置一定要记牢。顺便提一句,Qt默认还会在开始菜单里创建一个Qt命令行快捷方式“Qt 5.14.2 (msvc2015 64-bit)”,这个终端会在环境变量里临时注入Qt路径,后面用windeployqt做发布时很方便。
4.3 Qt Creator和VS集成工具的关系
很多人有一个误解,以为用VS开发Qt就必须安装Qt Creator。其实Qt Creator是可选的IDE。VS里真正干活的是Qt VS Tools扩展,负责调用Qt库和qmake。Qt Creator更多是用来做可视化界面、查看类文档或者用qmake独立构建。如果你只用VS写Qt,那么装完Qt库本体之后,Qt Creator甚至可以不装。当然,作为参考工具装上也很好,但别把扩展配置和Qt Creator配置搞混。
简单梳理这三者的关系:
- Qt库:实际的框架二进制和头文件
- Qt Creator:可选的IDE
- Qt VS Tools:VS内部的扩展,负责把Qt库和VS的MSVC工具链对接
把这条关系理清楚,配置的时候就不会慌。
5. VS2015里的Qt集成:Qt VS Tools的正确打开方式
5.1 选对扩展版本
老一点的教程会让你装“Visual Studio Add-in for Qt5”,但这个插件在Qt 5.14时代已经不太维护了,而且大概率也搜不到适配VS2015的新版。正确的做法是安装“Qt VS Tools”,它在VS扩展管理器或VSIX安装包中都可以获取。
需要注意Qt VS Tools各版本要求的VS版本不同。对VS2015来说,选用2.x版本即可。我这次用的2.7.2在VS2015上表现稳定。如果你装的是最新的Qt VS Tools,可能会看到它要求VS2017或更高版本,这时候就要回到旧版扩展。
安装扩展的方式:下载VSIX文件后,直接双击,VS会询问是否安装,一路“是”。或者打开VS菜单“工具 -> 扩展和更新”,从“联机”搜索Qt VS Tools也可以。不过在线搜到的版本往往比较新,可能出现不兼容,所以我一般直接用VSIX离线安装指定版本。
5.2 配置Qt Versions路径
扩展安装完成后,打开VS菜单,会多出一项“Qt VS Tools”。进入:
Qt VS Tools -> Qt Versions
这里需要添加刚才安装的qmake.exe所在目录,例如:
“D:\Qt\Qt5.14.2\5.14.2\msvc2015_64\bin\qmake.exe”
或者直接指定上面的qt bin目录。完成后,列表中会出现一条记录,版本显示5.14.2。保存后,VS就知道你的Qt库在哪里了。这一步相当于建立了Qt与VS之间的桥梁。没有这一步,后面新建Qt项目时会找不到任何可用Qt版本。
5.3 新建Qt项目并检查自动配置
配置好Qt Versions之后,在VS中“新建项目”,左侧选择“Visual C++ -> Qt”,右侧会出现“Qt Widgets Application”等模板。选中后,向导会让你选择要使用的Qt版本。此时下拉框中应能看到“5.14.2”,选择它并勾选“默认”。
向导生成的.vcxproj文件会自动把Qt的include、lib路径和依赖项写入工程配置里。我建议新建项目时注意一下“Project name”和“Location”要避免中文路径。向导生成后,先右击项目 -> 属性,展开“配置属性 -> 调试”查看“环境”一栏,你会发现插件自动写了类似“PATH=$(QTDIR)\bin;%PATH%”的字段,这说明默认配置是正确的。很多手动集成失败的项目,这一栏全靠手写,很容易遗漏。
6. 第一次测试:把Qt窗口程序跑起来
6.1 创建最简单的Hello Qt工程
我这里用最简的步骤来测试:
- VS2015里“文件 -> 新建 -> Qt Widgets Application”。
- 类名写MainWindow,基类默认QMainWindow。
- 打开main.cpp,确认代码如下:
#include "mainwindow.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); }这段代码就是Qt Widgets应用最基本的入口。它创建了一个QApplication对象,然后展示主窗口,进入事件循环。如果这一步编译运行没问题,说明VS和Qt的整个链路都是通的。
6.2 编译模式与工具集匹配
编译前,建议先在VS顶部把配置切换成“Debug x64”,原因有两条:
- Debug模式下可以看到更详细的错误信息,方便定位问题。
- 如果Release模式报错了,错误信息往往被优化掩盖,初学者很容易懵。
同时确认项目属性中的“平台工具集”是“Visual Studio 2015 (v140)”,不要变成v143或其他。虽然我们用VS2015打开项目时默认就是v140,但如果工程文件曾被其他版本VS动过,就可能被改成别的工具集,这点要单独确认。
6.3 生成解决方案并运行
上面的步骤都确认后,直接“生成 -> 生成解决方案”。如果生成成功,按F5开始调试。正常情况下,屏幕上会弹出一个空白Qt窗口。到这里,安装和配置环节就算真正跑通了,接下来就是你自己发挥的时间。
6.4 发布时补充运行库
这里顺便提一个很多人会忽略的细节:Qt的msvc2015_64库并不能像MFC那样把运行时完全静态链接到EXE里,发布于未安装Qt的机器时,要用windeployqt工具自动拷贝依赖的DLL和plugins。
具体来说,在Qt命令行终端中进入你的Release输出目录,执行:
cd /d D:\build\MyApp\release D:\Qt\Qt5.14.2\5.14.2\msvc2015_64\bin\windeployqt.exe MyApp.exe之后再把Release目录整体拷到目标机器上运行。这套发布流程虽然简单,但很多人忘了指定正确的Qt目录,导致分发后在目标机器上启动报“找不到Qt5Widgets.dll”之类的问题。用windeployqt拷贝完后,建议看一眼输出目录里的platforms文件夹是否存在,没有的话程序大概率起不来。
7. 我在Win10下碰到的高频坑
这一节我把实际踩过的、以及在线答疑时经常看到的几个问题集中写一下。每个问题都尽量给出排查思路,而不只是贴“把XX目录加进环境变量”这种一句话结论。
7.1 报错LNK1104:无法打开文件“qtmaind.lib”
这个问题有九成概率是Qt版本路径配置错了。症状是在链接阶段提示找不到qtmaind.lib(Debug版)或qtmain.lib(Release版)。原因一般是VS里的Qt Versions没配好,或者选错了套件。建议按顺序排查:
- 确认Qt VS Tools中Qt版本路径指向的是msvc2015_64/bin目录,不是mingw73_64/bin。
- 打开项目属性,查看“链接器 -> 常规 -> 附加库目录”,应包含“你的Qt路径\lib”。
- 查看“C/C++ -> 常规 -> 附加包含目录”,应包含“你的Qt路径\include”。
如果这三处都对,还报错,就把项目属性里的“链接器 -> 输入 -> 附加依赖项”截图看一下,是否有qtmaind.lib和Qt5Cored.lib。通常老工程迁移过来,附加依赖项会被清空,需要手动加回,或者右键工程执行“Qt VS Tools -> Update Qt Project”重新生成。
7.2 头文件找不到:No such file or directory
在VS中编译时,如果系统报“fatal error C1083: 无法打开包含文件: 'QMainWindow': No such file or directory”,说明编译器根本没有参与Qt的include目录。即便Qt VS Tools显示配置了版本,项目也可能会丢失include路径,尤其是一些模板在不勾选“导入”时很容易出现。
最简单的解决方式:右键工程“Qt VS Tools -> Update Qt Project”。这个功能会重新拉取Qt模块的include/lib配置。我遇到过旧项目改了.pro文件后没有执行这个更新,导致新增的类报头文件找不到,就是靠这个操作解决的。
7.3 链接器警告LNK2038或运行时库不匹配
如果项目配置里引入了不匹配的运行时库方式,很容易出现LNK2038“RuntimeLibrary mismatch”。常见场景是:Qt库本身是MD或MDd,而你在VS项目里把运行库设成了MT或MTd。
标准配置应该是:
- Debug:多线程调试DLL(/MDd)
- Release:多线程DLL(/MD)
排查入口:项目属性 -> C/C++ -> 代码生成 -> 运行库。
如果发现被改成MT/MTd,改回MD/MDd后重新编译。这个问题也常见于将第三方静态库和Qt混用的情况,比如一个用MT编译的第三方LIB被塞进MD的Qt工程中,就会疯狂报符号冲突。这种时候要么全工程统一运行库模式,要么给第三方库准备对应模式的二进制。
7.4 运行时找不到Qt5Cored.dll
按F5启动程序时,如果报“由于找不到Qt5Cored.dll,无法继续执行代码”,说明Qt运行时路径没有传给新进程。出现这个问题的原因一般是VS调试设置里没有把Qt的bin目录写进PATH。
解决办法有三个,任选其一:
- 把项目属性 -> 调试 -> 环境设置成:
PATH=D:\Qt\Qt5.14.2\5.14.2\msvc2015_64\bin;%PATH% - 先手动到上述bin目录下双击运行生成的exe,能起说明库文件没问题,再回头修VS配置。
- 把bin目录写入系统环境变量PATH,但不建议,因为多Qt版本混装时会引发其他程序加载错Qt库。
我推荐第一种方式,它把影响范围控制在单个项目内部,也能跟随解决方案一起使用。注意路径要写对,反斜杠或正斜杠都可以。
7.5 VS2015与VS2022共存时的工具集陷阱
最后说一个和本机多版本VS相关的兼容性细节。一旦系统里同时装有VS2015和VS2022,用户双击一个VS2015创建的.sln文件时,系统可视注册表的文件关联把文件打开方式指向最新版VS,于是VS2022被启动。如果你的Qt项目默认用v140工具集,VS2022可能提示需要重置平台工具集,如果误选升级,整个工程的平台工具集会变成v143,然后Qt msvc2015库的二进制就不匹配了。
避免方法比较直接:要么每次都从VS2015里用“打开项目”来选择文件,要么把.sln文件的默认打开方式固定为VS2015。还可以在代码库里放一个专门说明“使用VS2015 + v140工具集编译”的README,提醒团队其他人。工具集版本这东西,错一套就是一遍链接器错误,很有必要在文档层面约束住。
8. 安装完成之后的最后几步建议
环境跑通不代表万事大吉。我把自己后来习惯性补做的几件事列出来,供你参考。
首先,给系统做一个干净的环境变量整理。如果机器上原来装过其他版本的Qt,建议在PATH里删除那些旧的Qt bin路径,只保留当前项目用的Qt目录。否则带多个Qt版本的DLL一起出现在系统目录,很容易出现程序加载到了错误版本Qt库的情况,编译没问题但运行行为异常,排查起来极费时间。
其次,把VS的“外部依赖项”目录当成一个有用的调试窗口。在解决方案资源管理器里展开“外部依赖项”,你能看到当前Qt工程实际包含的头文件列表,查看它们来自哪个绝对路径,就能快速判断include指向是否正确。很多时候两个Qt版本混装,这里一眼就能看出来被你误配到了另一套路径。
再次,尽量在团队或自己的长期项目里统一Qt和VS版本。这话有点像废话,但我在实际维护中真见过一台机器上同时装着四个版本的Qt库,每个项目配置还各不相同。最后为了一个“莫名的闪退”查了两天,发现是另一个版本覆盖了本版本的Qt5Core.dll。建议给每个版本的Qt保留独立安装目录,不要安装到同一个根目录下覆盖。
最后,如果你只是自学者,不是被老项目绑住,我还是建议直接上VS2022 + Qt 6.x。时代在发展,新工具链的效率、调试体验都比这套老组合好太多。但如果你真的需要维护这套老环境,就按这篇文章的思路走一遍,它足够稳定,也足够被验证过。
关于“Visual Studio 2015 + Qt 5.14.2 在Win10下的安装配置”,我能想到的坑基本都在上面了。如果你是在2025年以后看到这篇内容,系统可能升级到了Windows 11,不过这套组合在Win11下大体同样适用。真的遇到上面没覆盖到的问题,最好的排查思路不是重装,而是逐个确认Qt版本、平台工具集、附加include/lib目录三者是否完全对应。三处对齐,九成问题都能解决。