Qt编译器迁移:从MinGW到MSVC

本文最后更新于:2022年10月11日 晚上

前情提要

众所周知,Qt支持两种编译器

  • MSVC(Microsoft Visual C++ Compiler):微软的VC编译器,如VS中自带
  • MinGW(Minimalist GNU for Windows):是将GNU开发工具移植到Win32平台下的产物

疯玛吉:选择!

那么,问题来了,小孩子才全都要,大人必须得选一个了

为什么要选呢

第一个问题在于,MSVCMinGW编译的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

其实说来也简单,首先,我们需要在QtMaintenanceTool.exe中添加MSVC组件(包含MSVC版本的dll)

Qt维护工具

其次,需要下载对应版本的VS(在该例中,我下载的是2022版也ok hhh)

这样,Qt就能自动检测到VS中的MSVC编译器和debugger

然后再项目中就能看到MSVC套件了,点击即可切换

切换toolkit

大逼兜

这就完了?想得美,这才哪到哪,也就算是刚在考卷上写完班级姓名吧

迎面而来的是满屏的WarningError

编码

其中最显眼的便是

1
warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失

这是由于MSVC默认只支持UTF-8(with BOM),而MinGW的原始编码可能是UFT-8,导致了编码不兼容

其中一个办法是更改源文件编码,但费时费力,而且原始的中文可能编译后是乱码(文件中看不出来)

终极解决方案应该是在.pro文件中加入如下代码:

1
2
3
4
msvc {
QMAKE_CFLAGS += /utf-8
QMAKE_CXXFLAGS += /utf-8
}

强制MSVC采用utf-8编译

编译

在现有工程中直接切换为MSVC还会导致编译问题

1
error: msvc-version.conf loaded but QMAKE_MSC_VER isn't set

还会导致识别不到项目文件

解决办法:手动清空工程原来编译后生成的文件夹及文件,重新生成工程即可

(特别是:.stash Makefile 之类的文件)

链接

由于MinGWMSVC的区别,某些库可能链接失败,需要手动在.pro文件中加入lib

如:LIBS += -luser32

dll

仔细观察QtMinGWMSVC文件夹,会发现他们的dll依赖都是不同的(同名但内容不同 推测是用对应编译器编译的)

并且MSVCdll都是有两个版本的(Release和Debug(文件名+d))

更有甚者,MSVCplugins/audio文件夹内居然多了一个qtaudio_wasapi.dll

导致QAudioDeviceInfo::availableDevices(QAudio::AudioOutput)卡顿,且重复输出音频设备(转换编译器后发现的第一个恶性bug)

解决方案是删除该dll

怪,真滴太怪了 家人们

后记

不过,Qt Creator原生支持MSVC,不用联合VS了,よかった www

我真傻 真的

Peace

Careful

为了让exe在非IDE环境下运行,我们通常都要设置环境变量(PATH

但是当MinGW/binMSVC/bin的环境变量共存时

其中的同名dll会产生误导和冲突,exe会自动选择靠前的环境变量中的dll

导致编译器不同时产生错误(dll不通用)

解决方案:

  • 改用同一个编译器
  • 拷贝dllexe同一目录(やばい)
  • 手动设置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博客

QtCreator + MSVC编译器开发_feimimizhiy的博客-CSDN博客_qtcreator配置编译器


Qt编译器迁移:从MinGW到MSVC
https://mrbeancpp.github.io/2022/10/09/Qt编译器迁移:从MinGW到MSVC/
作者
MrBeanC
发布于
2022年10月9日
许可协议