GCC简介

1.什么是GCC

GCC原名为GNU C语言编译器(GNU C Compiler),后来随着不断发展,被称为GNU编译器套件(GNU Compiler Collection)。是由 GNU 开发的编程语言译器。GNU 编译器套件包括 C、C++、Objective-C、Java、Ada 和 Go 语言前 端,也包括了这些语言的库(如 libstdc++,libgcj等)。

2.GCC的特点

  • GCC是一个可移植的编译器,支持多种硬件平台。例如ARM、X86等等。
  • GCC不仅是个本地编译器,它还能跨平台交叉编译。所谓的本地编译器,是指编译出来的程序只能够在本地环境进行运行。而gcc编译出来的程序能够在其他平台进行运行。例如嵌入式程序可在x86上编译,然后在arm上运行。
  • GCC有多种语言前端,用于解析不同的语言。
  • GCC是按模块化设计的,可以加入新语言和新CPU架构的支持。
  • GCC是自由软件。任何人都可以使用或更改这个软件。
  • GCC不仅支持 C 的许多“方言”,也可以区别不同的 C 语言标准;可以使用命令行选项来控制编译器在翻译源代码时应该遵循哪个 C 标准。例如,当使用命令行参数 -std=c99 启动 gcc 时,编译器支持 C99 标准。

3.编程语言发展史

image-20231020154850683

4.GCC工作流程

GCC编译程序主要经过四个过程:

  • 预处理(Pre-Processing)
  • 编译 (Compiling)
  • 汇编 (Assembling)
  • 链接 (Linking)

img

  • 预处理阶段将头文件、宏进行展开
  • 编译阶段,GCC调用不同语言的编译器,例如c语言调用编译器ccl。
  • 汇编阶段,GCC调用汇编器进行汇编,汇编器生成的是可重定位的目标文件。
  • 链接过程会将程序所需要的目标文件进行链接成可执行文件。

GCC的常用参数选项

选项名 作用
-o [file1] [file2] / [file2] -o [file1] 将文件 file2 编译成可执行文件 file1
-E 只运行C预编译器
-S 告诉编译器产生汇编程序文件后停止编译,产生的汇编语言文件拓展名为.s
-c 通知gcc取消连接步骤,即编译源码,并在最后生成目标文件
-Wall 使gcc对源文件的代码有问题的地方发出警告
-w 不生成任何警告信息
-Idir 指定 include 包含文件的搜索目录
-Ldir 指定编译的时候,搜索的库的路径。
-llib 在程序编译的时候,指定使用的库
-g 在目标文件中嵌入调试信息,以便gdb之类的调试程序调试
-On n的取值范围:0~3。编译器的优化选项的4个级别,-O0表 示没有优化,-O1为缺省值,-O3优化级别最高
-fPIC/fpic 生成与位置无关的代码
-shared 生成共享目标文件,通常用在建立共享库时
-std 指定C方言,如:-std=c99,gcc默认的方言是GNU C

关于GCC,gcc和g++的辨析

  • GCC:GNU Compiler Collection(GNU编译器套件),它可以编译C、C++、JAV、Fortran、Pascal、Object-C、Ada等语言。

  • gcc是GCC中的GUN C Compiler(C 编译器)

  • g++是GCC中的GUN C++ Compiler(C++编译器)

gcc和g++的主要区别

  1. 对于 .c和.cpp文件,gcc分别当做c和cpp文件编译(c和cpp的语法强度是不一样的)

  2. 对于 .c和.cpp文件,g++则统一当做cpp文件编译

  3. 使用g++编译文件时,g++会自动链接标准库STL,而gcc不会自动链接STL

  4. gcc在编译C文件时,可使用的预定义宏是比较少的

  5. gcc在编译cpp文件时/g++在编译c文件和cpp文件时(这时候gcc和g++调用的都是cpp文件的编译器),会加入一些额外的宏。

  6. 在用gcc编译c++文件时,为了能够使用STL,需要加参数 –lstdc++ ,但这并不代表 gcc –lstdc++ 和 g++等价,它们的区别不仅仅是这个。

参考

  1. https://www.cnblogs.com/QG-whz/p/5456720.html

  2. https://zhuanlan.zhihu.com/p/100050970