Qt编译器MinGW和MSVC的区别

https://blog.csdn.net/qq_43445867/article/details/127889570

一、两者的区别
1、MSVC:

即Microsoft Visual C++ Compiler,即微软自己的编译器
MSVC,就是上文所说的第三方C运行时库:由微软开发的VC运行时库,被Visual Studio IDE所集成。所以我们使用VS时会附带MSVC编译器。

2、MinGW:

MinGW(Minimalist GNUfor Windows),它是一个可自由使用和自由发布的Windows特定头文件和使用GNU工具集导入库的集合,允许你在Windows平台生成本地的Windows程序而不需要第三方C运行时(C Runtime)库。
<运行时库:支持程序运行的基本函数的集合,一般是静态库lib或动态库dll。>

二、两者优缺点
1、MSVC的优缺点
优点:

qtcreator的debuger有功能缺陷,经常会出现变量无法查看的问题,棘手的bug还是需要在VS环境下进行调试。很多人的开发模式就是qtcreator写代码,VS下面做调试。

缺点:

我不能跨平台

编码的问题,QT5的Qstring默认是UTF8格式,QT5极力推介把源码用UTF8格式存储。 但是MSVC只支持带BOM的UTF8格式,qmake不支持带BOM的UTF8格式,逼我只能用GBK么。这样的话,用qt5,每次都要Qstring::fromLocal8bit(“我是中国人”);况且就算BOM问题解决了,源代码是UTF8了。MSVC的执行编码也是GBK

2、MinGW的优缺点
优点:

我能跨平台!!!

缺点:

MinGW无法利用生成的dump文件在windbg或VS下面定位到出错的代码

Scene3D在MinGW64位Release和MinGW32位Debug模式下运行直接闪退,而64位Debug和32位Release却正常运行。

动态删除继承QuickItem的对象,有几率导致非法内存访问,可以定位到问题在Qt源码中Renderer中的一处

三、最后的选择
到底选择哪个版本,MinGW 比较方便,配置易上手适合初学者,MSVC功能强大,适合进阶,但是具体项目上要根据依赖的第三方库选择版本

如果你的第三方库是msvc的,能可能就必须msvc,如果第三方库是mingw的可能就必须mingw。

跨平台开发的话,用的库基本上一定是Linux能用的库,而Linux能用的库一定是在mingw下支持会比较好。(mingw甚至能 include unistd.h 之类的Linux专用头文件),那就首选mingw。

四、make和Cmake和qmake
有了编译器GCC等等, 为什么要有make这个构建生成器,同样是老生常谈的内容。编译hello.c非常简单,只需要$ gcc hello.c就可以了,但当项目庞大起来后,假设hello.c依赖与a.c、b.c,而a.c又依赖于库w.lib,每一次编译,我们都要重新编写一次gcc编译命令行吗?所以,GNU发明了make这个工具软件,可以编写makefile文件来指定特定的项目构建过程,当项目一个文件的代码更改时,我们只需要重新make一下就可以了。
但make依然有很多不足,比如make对于类unix系统是通用的,但对windows系统并不友好(不能跨平台)make语法简单,也就导致了它功能的限制不同编译器的语法规则不同,编写的makefile语法如果适合GCC则不适合MSVC所以,CMake就应运而生啦。
CMake是比Make更高一层的工具,Make是编写对应编译器的makefile从而实现编译,而CMake是写一份独立的CmakeList.txt文件,然后该文件会根据当前系统环境选择适合的构建生成器(如VS或者make),然后将CmakeList.txt翻译为适合的文件,再进一步调用系统编译器进行项目构建。

  顺便再老生常谈一下程序的整个过程:
 我们先放一段Hello World:hello.c#include <stdio.h>

int main()
{
printf(“Hello World”);
return 0;
}
然后就是一段老生常谈的描述了:
要想让这段代码在Linux上运行,我们需要使用GCC
预编译:将hello.c和stdio.h预编译为hello.i
编译:将hello.i编译为hello.s
汇编:将hello.s翻译为机器指令hello.o(.o目标文件)
链接:链接各种需要的库和其他目标文件(该hello程序不需要)得到可执行文件hello.out(相当于windows的.exe)

整个过程将高级语言翻译成了机器语言,而编译器,就是这样的一个翻译工具。GCC可以完成从预编译编译,汇编,链接整个过程。但是平时使用Visual Studio等软件时并没有接触到这个过程,因为VS是高度集成开发环境(IDE、Integrated Development Environment),集成了代码编辑器,编译器,调试器和图像化用户界面,上述所有程序编译和链接过程都用一步build构建带过了。

部分内容摘自:https://www.zhihu.com/question/333560253/answer/2282723843

  • 8
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用\[1\]中提到了在切换QT5 MinGWMSVC编译时遇到的问题,引用\[2\]中提到了编码的问题,以及QT5的Qstring默认是UTF8格式,而MSVC只支持带BOM的UTF8格式。引用\[3\]中提到了MSVC是微软自己的编译器,可以直接运行不需要编译。根据这些信息,可以得出qt mingwmsvc区别如下: 1. 编译器QT MinGW使用MinGW编译器,而MSVC使用微软自己的编译器Microsoft Visual C++ Compiler)。 2. 编码支持:QT MinGW默认使用UTF8编码,而MSVC只支持带BOM的UTF8编码。因此,在使用MSVC编译时,需要注意编码的转换。 3. 依赖库:在使用MSVC编译时,可以直接使用Windows下的OpenCV库,而不需要进行编译。这是因为MSVC编译器与Visual Studio的版本有对应关系,可以直接运行。 总结起来,QT MinGWMSVC区别主要在于编译器和编码支持方面。选择使用哪种编译器取决于项目的需求和开发环境的配置。 #### 引用[.reference_title] - *1* [QT5 MinGW切换MSVC编译问题](https://blog.csdn.net/xinlongabc/article/details/121708435)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Qt编译器MinGWMSVC区别](https://blog.csdn.net/qq_43445867/article/details/127889570)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Windows下的Qt编译器——MinGWMSVC区别](https://blog.csdn.net/flowerspring/article/details/116924437)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值