Qt编译器迁移:从MinGW到MSVC
本文最后更新于:2024年11月17日 晚上
前情提要
众所周知,Qt支持两种编译器
- MSVC(Microsoft Visual C++ Compiler):微软的VC编译器,如VS中自带
- MinGW(Minimalist GNU for Windows):是将GNU开发工具移植到Win32平台下的产物
疯玛吉:选择!
那么,问题来了,小孩子才全都要,大人必须得选一个了
为什么要选呢
第一个问题在于,MSVC和MinGW编译的dll通常不兼容,不能相互调用,这决定了你能用多少第三方库
- 在
Windows下,MSVC编译的库更多 - 但是
MinGW的库能跨平台(Linux)
所以你用哪个编译不取决于你想用哪个,取决于你习惯用来自哪个平台的第三方库
其次,MSVC,一听就是微软家的,Windows也是微软家的,亲生的编译器不用我多说吧(例如一些COM组件的操作在MinGW中就死活不能通过)
总结:
Windows平台选MSVC- 跨平台选
MinGW
疯玛吉:再选择!
除了两种编译器,我们还有三种开发方式

在VS中可以更好地进行调试,但是毕竟不是原生方式,多少有点问题少年了
一般选择QtCreator + MSVC方式进行Windows开发
正片(叠底
诶,那你说,我作为一个Windows程序员,既然选择QtCreator + MSVC无疑,为什么会写下这篇迁移博客呢?
咳咳
说来惭愧,我一直以为MSVC必须要用VS配合开发,就……
害,说多了都是泪
迁徙!
那么,在Qt Creator下,如何从MinGW切换为MSVC呢
其实说来也简单,首先,我们需要在Qt的MaintenanceTool.exe中添加MSVC组件(包含MSVC版本的dll)

其次,需要下载对应版本的VS(在该例中,我下载的是2022版也ok hhh)
这样,Qt就能自动检测到VS中的MSVC编译器和debugger了
然后再项目中就能看到MSVC套件了,点击即可切换

大逼兜
这就完了?想得美,这才哪到哪,也就算是刚在考卷上写完班级姓名吧
迎面而来的是满屏的Warning和Error
编码
其中最显眼的便是
1 | |
这是由于MSVC(早期版本)默认只支持UTF-8(with BOM),而MinGW的原始编码可能是UFT-8,导致了编码不兼容
其中一个办法是更改源文件编码,但费时费力,而且原始的中文可能编译后是乱码(文件中看不出来)
终极解决方案应该是在.pro文件中加入如下代码:
1 | |
强制MSVC采用utf-8编译
编译
在现有工程中直接切换为MSVC还会导致编译问题
1 | |
还会导致识别不到项目文件
解决办法:手动清空工程原来编译后生成的文件夹及文件,重新生成工程即可
(特别是:.stash Makefile 之类的文件)
链接
由于MinGW和MSVC的区别,某些库可能链接失败,需要手动在.pro文件中加入lib
如:LIBS += -luser32
dll
仔细观察Qt的MinGW和MSVC文件夹,会发现他们的dll依赖都是不同的(同名但内容不同 推测是用对应编译器编译的)
并且MSVC的dll都是有两个版本的(Release和Debug(文件名+d))
更有甚者,MSVC的plugins/audio文件夹内居然多了一个qtaudio_wasapi.dll
导致QAudioDeviceInfo::availableDevices(QAudio::AudioOutput)卡顿,且重复输出音频设备(转换编译器后发现的第一个恶性bug)
解决方案是删除该dll
怪,真滴太怪了 家人们
后记
不过,Qt Creator原生支持MSVC,不用联合VS了,よかった www
我真傻 真的
Peace
Careful
为了让exe在非IDE环境下运行,我们通常都要设置环境变量(PATH)
但是当MinGW/bin和MSVC/bin的环境变量共存时
其中的同名dll会产生误导和冲突,exe会自动选择靠前的环境变量中的dll
导致编译器不同时产生错误(dll不通用)
解决方案:
- 改用同一个编译器
- 拷贝
dll至exe同一目录(やばい) - 手动设置
exe环境变量
Ref
MSVC 中的utf-8编码问题 / Qt中文乱码问题 – li的blog
QT+MSVC的UTF-8配置、MSVC的UTF-8配置_lenkco的博客-CSDN博客_msvc utf8
Qt记录:Qt编程遇C2001错误,提示“常量中有换行符”_星辰丶大海的博客-CSDN博客_qt常量中有换行符
Qt MinGW与MSVC对比_16ern的博客-CSDN博客
Qt 用 MSVC 和 MinGW 哪个编译器编译程序比较好? - 知乎
Qt小白之选择何种开发方式(vs+qt or qt+mingw/msvc)_行思坐忆,志凌云的博客-CSDN博客
QAudioDeviceInfo::availableDevices 获取语音输入设备问题_#苔花如米小#的博客-CSDN博客
Qt编译错误: error: msvc-version.conf loaded but QMAKE_MSC_VER isn’t set_酷侠一剑绝ggh的博客-CSDN博客