-
什么是GCC
GCC编译器是LInux系统下最常用的C/C++编译器,大部分Linux发行版中都会默认安装,GCC编译器通常以gcc命令的形式在终端(Shell)中使用
-
GCC 原名为 GNU C语言编译器(GNU C Compiler)
-
GCC(GNU Compiler Collection,GNU编译器套件)是由 GNU 开发的编程语言
译器。GNU 编译器套件包括 C、C++、Objective-C、Java、Ada 和 Go 语言前
端,也包括了这些语言的库(如 libstdc++,libgcj等)
-
GCC 不仅支持 C 的许多“方言”,也可以区别不同的 C 语言标准;可以使用命令行
选项来控制编译器在翻译源代码时应该遵循哪个 C 标准。例如,当使用命令行参数
`-std=c99` 启动 GCC 时,编译器支持 C99 标准。
-
安装命令 sudo apt install gcc g++ (版本 > 4.8.5)
-
查看版本 gcc/g++ -v/--version
编程语言的发展:
GCC编译步骤
从hello.c到hello(或a.out)文件,必须经过 hello.i, hello.s , hello.o , 最后才得到目标文件,分别对应着预处理,编译,汇编,和链接四个步骤,整个过程如图所示·:
-
预处理:C编译器对各种预处理命令进行处理,包括头文件包含,宏定义的扩展,条件编译的选择等;
-
编译:将预处理得到的源代码文件进行语法语义分析,“翻译转换”产生出机器语言的目标程序,得到机器语言的汇编文件;
-
汇编:将汇编代码翻译成机器码,但是还是不能运行;
-
链接:处理可重定位的文件,把各种符号引用和符号定义转换为可执行文件中的合适信息,通常是虚拟地址。
根据test.c这个示例,跟踪每一个细节
test.c:
-
预处理
在gcc命令后加上-E参数,可以得到预处理文件
gcc -E test.c -o test.i
或者gcc test.c -E -o test.i
产生的test.i文件,就是test.c经过预处理后的文件,原本几行的代码,经过预处理,得到一个几千行的预处理文件,文件按打开内容如下。最后编译后的文件,前面几百行代码都是头文件的打开,注释也被预处理了
-
编译
在gcc编译参数加上-S,可以将test.i编译成test.s文件,命令如下:
gcc -S test.i
或者gcc test.i -S -o test.s
test.s是一个汇编文件,汇编语句我不懂,打开后是这样
-
汇编
得到汇编文件后,通过gcc就可以得到机器码了,在终端输入下面命令,可以得到test.o文件
gcc -c test.s
//gcc test.s -C -o test.o
这里的test.o还不能运行,我们可以直接用下面代码实现汇编跟链接
-
链接
尽管已经得到了机器码,但是这个文件还不能运行,必须经过链接才能运行,在终端输入下面命令,可以得到可执行文件a.out
gcc test.o
链接得到a.out文件,这个文件是gcc默认输出文件名称,可以通过-o参数致电给新的文件名。比如加上“-o test”就会生成test文件,这个文件其实跟a.out一样的。
GCC常用参数选项