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