文章目录
- window下常用的编译器
- 如何获取MSVC
- MinGW
- Linux和MaxOS下的编译器
- gcc和g++的区别
window下常用的编译器
- window下并不提供原生的类似gcc/g++的类unix系统下的C/C++编译器。常用的是 MSVC(Microsoft Visual C/C++)编译器,在我们安装完visual studio 2019后,会在 D:\software\visual_studio_2019\IDE\VC\Tools\MSVC\14.29.30133\bin目录下看到Hostx64和Hostx86这两个目录。Hostx64目录下有x64和x86两个目录。Hostx86目录下也有x64和x86两个目录。这里的Hostx64和Hostx86分别表示编译器软件的为啥,Hostx64下的是64位的编译器,Hostx86下的是32位的编译器。其下的x64和x86又分别代码 build的应用程序 所运行的目标平台。
2.下面以D:\software\visual_studio_2019\IDE\VC\Tools\MSVC\14.29.30133\bin\Hostx64\x64目录进行详细讲解:
其下 最重要的两个可执行文件是 cl.exe和link.exe (即MSVC编译器工具链主要由cl.exe与link.exe构成)
1.cl.exe用于控制在 Microsoft C/C++的编译器和链接器
2.link.exe 将通用对象文件格式 (COFF) 对象文件和库链接起来,以创建可执行 (.exe) 文件或 动态链接库 (DLL)
3.用户只需要调用cl.exe,即可完成编译-链接全过程。
如何获取MSVC
一般来说,获取MSVC要通过Microsoft Visual Studio来实现。对于一般的应用场景来说,我们不需要下载完整的IDE而是只需要下载单个组件下的MSVC C++ 生成工具,以及Windows 10 SDK(注意:如果主机系统是Windows 11则必须用Windows 11 SDK)即可。(MSVC C++生成工具包含了全部编译链接工具链以及大部分函数库与头文件;Windows 10 SDK只是提供其它的一些必要库文件与头文件)
我们想要在cmd下执行cl.exe命令,还需要配置环境变量。而使用Visual Studio 执行编译时,由IDE工具调用对应的cl.exe来编译链接,不需要我们手动干预。
MinGW
MinGW即Minimalist GNU For Windows,即为Windows系统开发的极简版的GNU, 区分32位和64位,实际上 MinGW 并不是一个 C/C++ 编译器,而是一套 GNU 工具集合。(除了包括GCC即GNU编译器集合,还包括其他的功能)里面包含gcc和g++的类Unix系统上的编译器。开发 MinGW 是为了那些不喜欢工作在 Linux(FreeBSD) 操作系统而留在 Windows 的人提供一套符合 GNU 的 GNU 工作环境。让人们在Windows系统下也可以使用gcc和g++的命令。
Linux和MaxOS下的编译器
在讲解Linux下的编译器时,先讲一个GNU的历史,GNU全称是 GNU’s Not Unix。即GNU不是Unix,我们都知道Unix是操作系统,但是GNU也是操作系统,模仿unix开发的但是它是开放自由的。但是至今也没有自己的真正内核,然而不是完整的操作系统。在实际使用上,多半使用Linux内核、FreeBSD等替代方案,作为系统核心,其中主要的操作系统是Linux的发行版。Linux操作系统包涵了Linux内核与其他自由软件项目中的GNU组件和软件,可以被称为GNU/Linux(见GNU/Linux命名争议)。
下面讲下GCC,其全称为GNU Compiler Collection,即GNU编译器集合。即GCC是GNU中的一部分。
gcc是GCC中的GNU C Compiler(C编译器);
g++是GCC中的GNU C++ Compiler(C++编译器);
事实上,虽然gcc和g++叫做xxx编译器,但它们只是一种驱动器,根据要编译的文件类型去调用对应的GNU编译器。
gcc和g++的区别
1.gcc可以编译.c文件和.cpp文件,并且gcc会区分它们,分别当作c和cpp文件编译;
2.g++也可以编译.c文件和.cpp文件,但是g++不区分它们,都当做cpp文件编译。
3.编译时,gcc和g++都可以使用,因为编译阶段时g++会调用gcc进行编译;
4.链接时,g++可以使用,gcc需要添加"-lstdc++"才可以使用,因为gcc不能自动和C++库链接,所以一般使用g++进行链接;
5.gcc在编译cpp文件时、g++在编译c文件和cpp文件时,gcc和g++调用的都是cpp文件的编译器,且会加入一些额外的宏定义,宏定义
#define __GXX_WEAK__ 1
#define __cplusplus 1
#define __DEPRECATED 1
#define __GNUG__ 4
#define __EXCEPTIONS 1
#define __private_extern__ extern