Qt 5.14.2 与 VS2019 搭配 MSVC2017 编译器配置指南

Qt 5.14.2 与 VS2019 搭配 MSVC2017 编译器配置指南 搞Qt开发的人多多少少都遇过这种尴尬Qt装好了、VS2019也装好了打开Qt Creator一看编译器列表里空空荡荡Kit套件一栏挂着一串黄色感叹号新建项目直接卡在“找不到编译器”那一步。这个问题在Qt 5.14.2配VS2019时特别典型——你装的是VS2019Qt安装包里的库却默认是MSVC2017编的两边谁都不认识谁。我第一次碰到时也懵了半天后来搞明白了Qt 5.14.2官方安装器里其实并没有MSVC2019的预编译库只有MSVC2017 32/64位和MinGW这几套而VS2019默认又只带v142工具集不会自动装v141。想让它们一起干活就得把VS2019里的MSVC v141工具集单独装回来再在Qt Creator里把它跟Qt库配对。这篇文章就讲这套配置从版本匹配原理到安装勾选、Kit配置、验证和排坑适合刚装完Qt一头雾水的新手也适合老手回查配置细节。1. 为什么是Qt 5.14.2 VS2019 MSVC2017这个组合1.1 这套组合到底解决什么问题先说背景。Qt 5.14.2是5.14分支的最后一个补丁版本很多商业项目、老项目都在用它尤其是那些因为授权协议限制不能上5.15 LTS的团队这套版本几乎是默认选择。VS2019则是目前Windows下最常见的C开发环境公司统一装VS2019的也很多。问题在于Qt官方安装器里提供的预编译库5.14.2时代默认带的还是MSVC2017——你打开安装器看组件列表会发现MSVC 2017 32-bit、MSVC 2017 64-bit都在但MSVC 2019 64-bit根本没有。这不是Qt官方失误而是版本发布时间线决定的Qt 5.14.2发布时VS2019刚出来不久官方还没有稳定的MSVC2019构建所以5.14.2的可执行文件都是基于VS2017工具集编译的。我见过不少人被网上各种文章误导以为VS2019装了就能直接用Qt 5.14.2结果Qt Creator里Kit永远有个叹号。还有人是做ArcGIS Engine 10.8这类商业组件二次开发的环境要求卡得比较死VS2019是公司新装的IDE但配套的Qt库还是老的MSVC2017被迫在这个组合里折腾。所以真正要解决的问题是让VS2019环境下的Qt Creator能正确识别并调用MSVC2017 (v141) 编译器使编译出来的程序与Qt库的二进制规则保持一致。1.2 版本匹配背后的ABI原理这里得讲清楚一个概念ABIApplication Binary Interface。你可以把它理解成编译器之间的一种“暗号”协议——结构体怎么在内存里排布、虚函数表怎么组织、异常怎么抛出、函数名字怎么修饰全都按这套规则来。两个C程序或者库要二进制兼容ABI必须一致。Qt本身是一套巨大的CStyle接口暴露的C库你的主程序要跟Qt5Core.dll、Qt5Widgets.dll这些动态库配合双方对类对象的内存布局理解必须完全一致否则编译器不报错程序一运行就可能崩。MSVC的编译器版本分得很细VS2015对应v140、VS2017对应v141、VS2019对应v142。虽然微软承诺过2015到2019之间的MSVC工具集保持向后兼容但Qt官方依然很谨慎地把MSVC2017和MSVC2019的库分别打包说明不同工具集之间还是存在细微差异尤其是异常处理、Debug信息、标准库实现细节上。最稳妥的方式就是你用Qt哪个库编的就用哪个版本的编译器编你的代码。Qt 5.14.2的msvc2017_64库是v141编的那你的项目也应该用v141编译器这就是无数人踩坑之后回归到MSVC2017的原因。顺带说一句千万不要想着用MinGW来替代MSVC。MinGW用的是GCC的编译器和GNU的C运行库跟MSVC的DLL完全是两套ABI链接阶段过不去还是小事就算强行链接过运行时也大概率崩。Qt里MinGW和MSVC是两个完全独立的生态互不相通。2. 环境准备Qt与VS2019的安装要点2.1 Qt 5.14.2安装时该勾哪些组件安装Qt 5.14.2其实没什么玄学关键是组件别勾错。进入安装器之后找到Qt 5.14.2这个节点展开后你会看到MinGW 7.3.0 64-bit、MinGW 7.3.0 32-bit、MSVC 2017 64-bit、MSVC 2017 32-bit、UWP相关的几个子项等。如果你主要是做Windows桌面程序重点勾选两个MSVC 2017 64-bit这是主力对应文件夹名是msvc2017_64MSVC 2017 32-bit如果以后要编32位程序就勾上不需要可以先不装省点磁盘空间有人问要不要跟着装Qt Creator我的建议是装用官方自带版本就好省得后面手动关联一堆东西。你如果喜欢Qt Creator独立新版也可以单独下但Kits里要自己指定qmake路径多一步操作。还有个特别容易坑人的点安装路径不要出现中文和空格。比如别装在D:\软件\Qt也别装在默认的C:\Program Files\Qt。为什么因为Qt的qmake生成的Makefile、构建时的中间文件路径里一旦有空格很容易触发各种奇怪的转义问题你排查半天都找不到原因。我习惯用C:\Qt\Qt5.14.2或者D:\Qt\Qt5.14.2简短干净所有工程也放在纯英文路径下。装完之后你可以在Qt安装目录里看到C:\Qt\Qt5.14.2\5.14.2\msvc2017_64\bin\qmake.exe这个文件。记住这个路径后面有得用。2.2 VS2019安装时容易被忽略的v141工具集VS2019默认装好之后自带的编译器是MSVC v142对应VS2019自身。你打开VS2019的开发者命令行敲cl能正常编译但这不意味着你就能在Qt Creator里配出MSVC2017编译套件——因为v141工具集默认并没有装。要让VS2019识别并构建v141你需要从Visual Studio Installer的“单个组件”标签页里手动安装。具体步骤打开Visual Studio Installer找到你已安装的VS2019版本点击“修改”切到“单个组件”选项卡在右上角搜索框输入“v141”勾选“MSVC v141 - VS 2017 C x64/x86 生成工具 (v14.16)”这一项顺带确认你已经勾选了“Windows 10 SDK”相关的组件通常“使用C的桌面开发”工作负载会默认带上没有就手动勾点“修改”让它安装这个过程会下载一些包可能要等几分钟。装完之后你的VS目录下会多出一个14.16.xxxxx之类的文件夹这个版本号就是v141。微软后面还发过v14.16的几个更新分支不影响使用。这里有个细节如果你嫌麻烦也可以直接独立安装“Visual Studio 2017 Build Tools”它提供的也是v141工具集效果相同。但既然你已经装了VS2019建议还是直接在VS2019里加装v141这样VS2019和Qt Creator两边都能识别切换开发环境也更方便。怎么确认v141装好了最简单的办法打开文件资源管理器看C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\下有没有14.16开头的目录。有就说明工具集到位了。如果你看的是2019专业版或者企业版路径中间的Community要换成Professional或Enterprise这个不用我多说。2.3 Windows SDK版本的取舍Windows SDK也是很多配置问题的大坑之一。Qt Creator构建项目的时候其实不直接依赖SDK但编译器在编译Windows API相关代码时必须找到windows.h、winsock2.h这些头文件链接的时候也要找到kernel32.lib、user32.lib这些导入库这些全都靠Windows SDK提供。VS2019默认安装的Windows 10 SDK一般够用Qt 5.14.2的库本身就是用Win10 SDK构建的两者兼容性没问题。但如果你的系统里同时装了多个SDK版本比如Win10 SDK和Win11 SDK并存Qt Creator在Kit里会让你选目标SDK版本这时候选跟Qt库匹配的版本就好通常选最新的稳定版。SDL和平台工具集版本这个细节普通项目不用太操心真出问题时再去针对性调。3. 核心配置让MSVC2017编译器在Qt Creator里“显形”3.1 先确认v141工具集是不是真的装好了配置之前先做个体检。确认v141工具集到位最常见的三种验证方式看目录检查VS2019安装目录下是否存在v141工具集文件夹即VC\Tools\MSVC\14.16.*有就说明编译器本体已经装好看命令打开“Developer Command Prompt for VS2019”手动切换到v141环境输入vcvarsall.bat x64 -vcvars_ver14.16然后执行cl正常输出说明编译器可用看VS Installer在VS Installer的“已安装”-“修改”-“单个组件”里能看到“MSVC v141”处于勾选状态这一步别跳过。我遇过不少朋友直接跳到Qt Creator里配置折腾半天发现v141根本没装白白浪费时间。确认没问题之后再把Qt Creator完全关闭重新打开。Qt Creator对编译器的检测是在启动时完成的如果启动时还没重启它不会自动刷新编译器列表。很多“装好了却看不到”的怪问题重启一下Qt Creator就解决了。3.2 在Qt Creator里添加MSVC2017编译器重新打开Qt Creator之后依次进入菜单“工具”-“选项”-“Kits”左侧选“编译器”标签页。正常情况下自动检测区域里会列出一堆编译器比如Microsoft Visual C Compiler 16.4 amd64Microsoft Visual C Compiler 16.4 x86Microsoft Visual C Compiler 16.4 x86_amd64这些都是v142对应VS2019。如果你看到多了类似“Microsoft Visual C Compiler 14.16 amd64”这样的项那恭喜v141已经被自动检测到了。如果没自动出现点右侧的“添加”按钮选择“MSVC”-“Microsoft Visual C Compiler (x64, amd64)”32位就选x86然后手动指定cl.exe的路径一般是C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.16.27023\bin\Hostx64\x64\cl.exe版本号按你机器上实际目录填具体路径到VC\Tools\MSVC下面翻一下就知道。这里有个关键点一定要选amd64也就是原生64位编译器。列表里可能同时有x86_amd64和amd64两个选项前者是32位编译器跨平台编译64位程序能用是能用但运行速度和生成的代码质量都不如原生64位编译器。Qt的msvc2017_64库是纯64位构建配amd64编译器最对口。编译器页面里注意看它的ABI字段确认是x86-windows-msvc还是x64-windows-msvc对应你的Qt库位数。3.3 创建/修改Kit套件编译器和Qt库都到位之后最后一步就是把它们组合成一个Kit。回到Kits标签页选中自动检测到的“Qt 5.14.2 MSVC2017 64bit”或者自己手动新建一个都行。一个完整可用的Kit需要配齐这几项编译器C语言和C语言都选择14.16 amd64那个v141Qt版本选择qmake路径指向C:\Qt\Qt5.14.2\5.14.2\msvc2017_64\bin\qmake.exeCMake如果你用CMake构建选一个合适的CMake版本纯qmake项目可以不管调试器装了Windows SDK之后Qt Creator会自动检测到CDB调试器选上就好没有也无伤大雅顶多断点调试用不了配好之后看Kit那一行的状态描述正常的Kit只显示“Qt 5.14.2 (5.14.2)”没有黄色感叹号没有“No compiler”之类的文字。如果你看到警告鼠标悬停上去看具体提示一般就是编译器没选、qmake路径不对、ABI不一致这三种情况回到前两步逐一排查。3.4 几个关键细节ABI匹配、qmake路径、环境变量配置过程中有三件事你一定会碰到碰不到说明你运气好提前打个预防针第一ABI匹配问题。Qt Creator的Kit页面底部会显示当前套件的ABI比如x64-windows-msvc-pe-64bit。这个ABI必须和Qt库的ABI一致。msvc2017_64对应的是x64-windows-msvcmsvc2017_32对应的是x86-windows-msvc。如果你拿amd64的编译器配了32位的Qt库或者反过来Qt Creator会直接告诉你“无法使用此编译器”或者编译时出现莫名其妙的链接错误。第二qmake路径问题。一台机器装了多个Qt版本很正常Kits里一定要确保当前Kit选择的是msvc2017_64的qmake而不是MinGW的qmake也不是MSVC2019的qmake。你可以在Kits页面的Qt版本下拉框里看到每个qmake对应的路径选之前确认一下。第三环境变量问题。Qt Creator运行程序的时候会自动把Qt的bin目录C:\Qt\Qt5.14.2\5.14.2\msvc2017_64\bin加到程序的环境变量里所以你在Qt Creator里直接运行没问题。但如果你编译完跑到资源管理器里双击exe经常会弹窗提示“找不到Qt5Cored.dll”——这是因为没有任何环境变量告诉系统去Qt目录找dll。解决方法很简单把Qt的bin路径加到系统PATH环境变量里去一劳永逸。4. 实操验证从新建项目到第一个窗口跑起来4.1 最小验证项目配置好Kit心里还是没底动手验证。打开Qt Creator文件-新建项目选择“Qt Widgets Application”项目名称起个简单的比如demo001路径一定要纯英文。到了构建套件选择页面确认勾选的正是你刚配好的那个Kit名字一般是“Qt 5.14.2 MSVC2017 64bit”或类似不要选成MinGW的套件直接下一步下一步完成。这里的编译过程值得多说一句。Qt Creator默认根据项目的.pro文件调用qmake生成Makefile然后再调用底层构建工具。你在编译输出窗口能看到类似这样的内容11:03:24: 配置步骤... 11:03:26: 正在执行 C:\Qt\Qt5.14.2\5.14.2\msvc2017_64\bin\qmake.exe ... 11:03:28: 正在执行 C:\Qt\Qt5.14.2\Tools\QtCreator\bin\jom\jom.exe ...jom是Qt自带的并行构建工具相当于让nmake支持多线程编译。jom调用cl.exe编译器和link.exe链接器完成整个过程所以你在编译输出里能看到所有编译器的路径。这里如果编译器配置错了很直观就能看到输出里的cl.exe路径带的是14.16还是16.4一眼就能分辨。4.2 编译细节Debug/Release与构建目录Qt Creator会按你选择的构建模式Debug还是Release把构建产物分别放在项目文件夹下的debug和release子目录。Debug模式下会生成带d后缀的Qt库依赖比如Qt5Cored.dll、Qt5Widgetsd.dllRelease模式则依赖不带d后缀的Qt5Core.dll、Qt5Widgets.dll。这也是一个容易出坑的地方Debug版的程序必须用Debug版的Qt库Release版同理混着用会报错或者莫名崩溃。第一次编译的时候耐心看完整条输出正常情况下会看到编译、链接、生成exe的完整链路。如果中间某一步挂了先别慌看输出窗口里第一行红色的错误那才是根因。编译完成后点左下角的绿色三角形运行按钮弹出一个空白窗口说明整套MSVC2017配置已经成功了。4.3 从VS2019里也能编译Qt项目吗很多人的感受是Qt Creator虽好但我的主力IDE是VS2019想在VS里调试Qt代码怎么办。其实是可以的用微软官方提供的“Qt VS Tools”扩展就能在VS2019里直接打开.pro文件或CMakeLists.txt的Qt项目。装上扩展后在VS的“扩展”-“Qt VS Tools”-“Qt Versions”里填写Qt版本路径指向C:\Qt\Qt5.14.2\5.14.2\msvc2017_64就行。但要注意如果直接打开一个Qt项目VS会按它默认的平台工具集去编译默认是v142。这时你要右键项目名选择“属性”在“常规”-“平台工具集”里改成“Visual Studio 2017 (v141)”否则就是用v142编译器去硬编Qt库的代码ABI不匹配的风险又回来了。5. 高频问题与排查实录5.1 常见报错速查表这部分都是我在实际配置过程中踩过、或者帮别人排查过的典型问题整理成一张表建议收藏。现象原因解决方法Kit显示黄色感叹号提示No compilerv141工具集没装或Qt Creator没重启扫描装v141重启Qt Creator编译报MSB8020错误找不到v141生成工具项目工具集设为v141但VS中没装对应组件装v141工具集或把项目工具集改为v142编译提示找不到windows.hWindows SDK没装或没选对VS Installer里勾选Windows 10 SDK组件点击运行时提示“Cannot find file: xxx.exe”链接阶段失败exe没生成看完整输出通常是ABI不匹配或库路径不对程序双击运行时提示找不到Qt5Core.dll系统PATH里没有Qt的bin目录把C:\Qt\Qt5.14.2\5.14.2\msvc2017_64\bin加入PATH运行时弹窗“无法定位程序输入点”Debug/Release库混用或编译器与Qt库ABI不匹配统一用v141编译器清理构建目录重新编译Qt Creator提示“Could not find qmake”Kit里Qt版本未配置或qmake路径错手动指向msvc2017_64的qmake.exe中文路径下编译报各种奇怪的错Qt的构建系统对非ASCII路径支持不好项目路径和Qt安装路径都用纯英文5.2 我踩过的两个比较典型的坑第一个坑是装了v141工具集Qt Creator还是检测不到编译器。后来查了很久发现是自己装了工具集之后开着Qt Creator不关它一直在用启动时的扫描结果所以看不到新编译器。把Qt Creator完全退掉重新打开编译器列表才刷新出来。所以再强调一遍凡是装完新组件、新编译器之后发现Qt Creator不认第一件事就是重启Qt Creator而不是去重装Qt。第二个坑是用v142编译器硬编Qt 5.14.2的项目Debug能跑Release崩。这个坑相当迷惑人。当时项目要发布Release版我在Qt Creator的Kit里配了v142编译器加上msvc2017_64的Qt库编译非常顺利Debug版运行也正常。但切到Release之后程序跑起来几秒就崩也没有明显的报错信息。折腾很久后我突然意识到这大概率是ABI不匹配的隐患在作祟。MSVC v142和v141虽然官方说二进制兼容但涉及Qt框架内部的模板、STL容器交互时细微的布局差异在Release优化下就会暴露出来。换成v141编译器重新编译之后Release版一次过再也没崩过。所以不要抱侥幸心理老老实实按照“Qt什么库版本就用什么编译器版本”的规则来做。5.3 如果确实没有v141工具集怎么办现实中有种情况公司电脑权限受限VS Installer里没法新增组件或者安装v141工具集一直失败。遇到这种问题有几个备选方案方案一独立安装VS2017 Build Tools。这是微软出的独立C构建工具里面包含完整的v141工具集可以不依赖VS2019独立存在。安装后Qt Creator同样能自动检测到其中的编译器。方案二换用Qt 5.14.2的MSVC2019预编译库。如果你能拿到第三方编译的MSVC2019版本或者自己动手编译Qt源码那直接用v142编译器就不算硬来了。但这属于“水管坏了不修水管反而修房子”的扩招路径工程量偏大非必要不建议。方案三改用MinGW套件。如果你的项目不依赖任何MSVC专属库也可以把项目换成Qt自带的MinGW编译器。但如果你依赖了MSVC编译的插件或第三方库这条路就行不通。所以正常情况首选还是把v141工具集装好这是最省事也最稳定的方式。6. 最后再分享一点实际经验整套配置跑通之后你会发现后续维护也没那么麻烦。我个人的习惯是Windows下统一把Qt安装在短路径的英文目录系统PATH里加上Qt的bin路径VS2019里v141和v142工具集都装上Qt安装器里MSVC2017和MSVC2019的库也都勾上。这样不管接手的项目是老的Qt 5.14.2还是新的Qt 5.15都能在同一个系统里快速切Kit不用来回重装。还有个容易忽略的点Qt Creator的Kit配置其实是按用户目录存储的换电脑或者重置开发环境之后配置全没了但只要你机器上已经装了这些工具重配一遍也就五分钟的事。所以不用害怕重装环境掌握原理之后这事情就是个肌肉记忆。如果你是在团队里做这一套配置建议把Kit名字、编译器版本、SDK版本统一约定死跟同事确认好。不同的同事电脑上装的工具集不一致互相传代码和发布包时很容易出兼容性问题。别问我怎么知道的我在这个问题上替团队踩过的坑说出来都是泪。最后再提醒一句如果你编译的时候遇到莫名的链接错误和运行时崩溃先别怀疑Qt坏了也别重装整个Qt环境优先检查编译器的工具集版本和Qt库版本是否匹配。很多问题往往就是一个工具集版本没对上导致的排查时把这个因素放在最前面能省下大量时间。