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博客