GCC编译器其实也是 Linux GCC命令,它以命令的形式在终端(Shell)中使用,有很多选项。
GCC 是一个交叉平台的编译器,目前支持几乎所有主流 CPU 处理器平台(例如 i386、ix86_64、SPARCE、ARM、MIPS 等),它可以完成从 C、C++、Objective-C 等源文件向运行在特定 CPU 硬件上的目标代码的转换。
GCC 不仅功能非常强大,结构也异常灵活,便携性(portable)与跨平台支持(cross-platform support)特性是GCC的显著优点。
GCC 具有丰富的配套工具链支持。GCC 不是一个孤立的编译器,而是整个 GNU 工程中的一个组成部分。GNU 工程中的其他软件,包括 GNU C 库 glibc、GNU 的调试工具 gdb,以及 GNU 二进制工具链 binutils(GNU Binutils Toolchains,例如汇编工具 as,连接工具 ld,目标文件分析工具 objdump、objcopy 等)等都与 GCC 关系密切,互相依赖。
接下来以一个具体的例子来阐述GCC是如何对C程序进行编译的:
如上所述,在终端中GCC是以命令的形式使用的,
(1)-E:这个命令是对程序进行预处理,这个过程包括(宏替换、头文件展开、条件编译、去注释),将我们所编写的C程序变成一个符合要求的C程序
所编写的C程序:
#include <stdio.h>
#include <unistd.h>
#define MAX 18
int main()
{//定义两个变量,并求和
int a = 10;
int b = 20;
int c = a + b;
printf("%d\n",c);
//输出MAX的值
printf("%d\n",MAX);
return 0;
}
对程序进行预处理:
如图生成test.i 文件,查看预处理之后的程序(去掉了注释,进行了宏替换)
(2)-S:对程序进行编译,将C程序转化成汇编语言
如图生成了一个test.s文件,对该文件进行查看:
(3)-c:汇编过程,将汇编语言转化成二进制文件(此时的二进制文件不能执行)
如图汇编之后生成一个test.o文件(可执行文件),对此文件进行查看:
使用 od test.o 可看到0 1序列:
(4)-o:这个命令可以写也可以不写,此处省略,对程序进行连接,生成可执行文件;
如图生成a.out可执行文件;
运行程序:
综上:
GCC编译程序的步骤:
预处理(宏替换、头文件展开、条件编译、去注释)将C程序标准化;-E
编译:将C语言转化成汇编语言;-S
汇编:将汇编语言转化成二进制文件(此时的二进制文件不能执行);-c
链接:生成可执行的二进制文件;-o
其他命令即详述:
http://www.runoob.com/w3cnote/gcc-parameter-detail.html