第一:linux gcc包含的c/c 编译器 gcc 、cc 、c 、g
其中gcc和cc是一样的,c 和g 是一样的,一般c语言程序就用gcc编译,c 程序就用g 编译。
第二:gcc特点
gcc是一个可移植的编译器,支持多种硬件平台。例如ARM、X86等等。 gcc不仅是个本地编译器,它还能跨平台交叉编译。所谓的本地编译器,是指编译出来的程序只能够在本地环境进行运行。而gcc编译出来的程序能够在其他平台进行运行。 gcc有多种语言前端,用于解析不同的语言另外gcc是按模块化设计的,可以加入新语言和新CPU架构的支持。gcc是自由软件。任何人都可以使用或更改这个软件。
第三:gcc的运行过程
(1)在命令行输入: gcc test.c
这样会默认编译出一个名为 a.out的程序,
再在命令行输入 :./a.out
就可以运行程序。
(2)如果在命令行输入: gcc test.c -o test
这样将编译出一个名为test的程序
再在命令行输入 :./test
就可以运行程序。
注:其中 -o 参数 用来指定生成程序的名字
(3)分步执行,更具体形象
其中包含4个过程:
1.预处理
本质 会进行4个操作(包括头文件的展开、去掉注释、宏替换、条件编译)、
具体操作:命令行输入: gcc -E test.c -o test.i
这句命令意思是:走完预处理第一步就会停下来,将产生的临时内容存放在 test.i文件中
2.编译
本质 就是把c语言变成汇编语言
具体操作:命令行输入: gcc -S test.i -o test.s
这句命令意思是: 走完编译第二步就会停下来,将产生的临时内容存放在 test.s文件中
3.汇编
本质 就是把汇编语言变成目标二进制文件(不可执行)
具体操作:命令行输入: gcc -c test.s -o test.o
这句命令意思是:走完汇编第三步就会停下来,将产生的临时内容存放在 test.o文件中
4.链接
本质 就是引入我们在代码中使用的第三方库生成可执行文件或库文件
(第三方库由编译器和文件后缀共同决定)
第四:gcc选项
-E | 只进行预处理操作 |
---|---|
-S | 编译到汇编停止(不进行汇编,只完成预处理和编译) |
-c | 进行汇编操作(编译到汇编代码) |
-O[0,1,2,3] | 优化程序(默认为2级优化,0不优化,3优化级别最高) |
-static | 对生成的文件采用静态链接 |
-shared | 尽量使用动态库 |
-Idir | 将dir目录加入搜索头文件的目录路径 |
-Ldir | 将dir目录加入搜索库的目录路径 |
-llib | 连接lib库 |
-Wall | 使gcc对源文件的代码有问题的地方发出警告信息 |
-W | 不发出警告信息 |
-g | 在目标文件中生成调试信息,以便gdb之类的调试程序调试 |
-ggdb | 生成更多调试信息 |
第五:gcc所遵循的部分约定规则
首先先谈一个概念,不是说linux中一切都是文件吗?后缀没有用吗?但在gcc中,后缀是非常重要的,用来区分文件的类别。我简单总结了几种后缀:
后缀 | 类别 |
---|---|
.c | C语言源代码文件 |
.C / .cc / .cxx | C 源代码文件 |
.h | 程序所包含的头文件 |
.i | 已经预处理过的C源代码文件 |
.ii | 已经预处理过的C 源代码文件 |
.a | 由目标文件构成的库文件 |
.o | 编译后的目标文件 |
.s | 汇编语言源代码文件 |
.S | 经过预编译的汇编语言源代码文件 |
.m | Objective-C源代码文件 |