内容介绍
一.gcc编译器简介
二.一般编译举例
三.预处理
四.编译
五.汇编
六.链接
七.gcc编译优化
一.gcc编译器的简单介绍
gcc是GNU项目中符合ANSI C标准的编译系统,是开放源代码领域应用最广泛的编译器,又是一个交叉平台编译器,功能强大。GCC可以用来编译C/C++、FORTRAN、JAVA、OBJC、ADA等语言的程序,它能够在当前CPU平台上为多种不同体系结构的硬件平台开发软件。
二.一般编译举例
通常我们对一个源文件进行编译时都是使用:gcc hello.c -o hello 这一命令,下面是编译示例
这一编译进过了预处理、编译、汇编、链接四个阶段,最终生成hello这一可执行程序。
三.预处理
预处理是C语言程序从源代码转变成可执行程序的第一步,它在程序编译的第一个阶段处理源代码的文本,主要包括头文件的包含、宏定义的扩展、条件编译的选择等并打印出预处理之后的结果。预处理阶段根据已放在文件中的预处理指令来修改源文件。例如:#include<stdio.h>、#include<math.h>等都是预处理指令,他们的内容会被添加到
•C文件中。主要有以下几方面处理:头文件包含指令(如#include<stdio.h>)、条件编译(如#endif)、宏定义指令(#define a)。
预处理语句:gcc -E filename,生成.i文件。生成的.i文件比较繁琐,对于这种情况我们可用gcc -E filename1 filename2将filename1的处理结果放入filename2文件中,查看时打开该文件即可。例如:
此时hello.c预编译后的文件内容存放到了hello.i文件中。
四.编译
编译所做的工作就是通过词法分析和语法分析,在确认所有语法都正确的条件下,将文本文件转换为等价的汇编代码。
gcc -c filename,该指令只进行到编译阶段,执行后生成.o文件。
五.汇编
汇编的本质是将汇编代码转换成能被机器识别的机器语言,生成的目标程序中存放的也就是与源代码等价的机器代码。
gcc -s filename ,该指令只进行到汇编阶段,执行后生成.s文件。
六.链接
1、链接的主要任务就是将有关的目标文件彼此相连接,使得这些目标文件成为一个能被操作系统装入执行的统一整体。链接处理有两种,一种是静态链接,一种是动态链接。在静态链接下函数的代码将从其所在的静态链接库中拷贝到目标文件中;动态链接下函数的代码被放到称为动态链接库或共享对象的某个目标文件中,在可执行文件执行时动态链接库的全部内容将被映射到运行时相应进程的虚拟空间中。
2、静态库链接时搜索路径顺序:
1. ld会去找GCC命令中的参数-L
2. 再找gcc的环境变量LIBRARY_PATH
3. 再找内定目录 /lib /usr/lib /usr/local/lib 这是当初compile gcc时写在程序内的
3、动态链接时、执行时搜索路径顺序:
1. 编译目标代码时指定的动态库搜索路径
2. 环境变量LD_LIBRARY_PATH指定的动态库搜索路径
3. 配置文件/etc/ld.so.conf中指定的动态库搜索路径
4. 默认的动态库搜索路径/lib
5. 默认的动态库搜索路径/usr/lib
七.gcc编译优化
gcc有三个优化选项,分别为gcc -o1 filename、gcc -o2 filename、gcc -o3 filename。1、gcc -o1 filename:这一优化称一级优化,该模式下对于一个大的函数或者会花费很多时间和内存的情况下,其编译时会尝试减少代码体积和代码的运行时间。
2、gcc -o2 filename:这一优化称二级优化,它在一级优化下进一步优化,优化时编译器不会进行循环展开和函数内联,这种优化会增加编译时间但会生成性能更好的代码。
3、gcc -o3 filename:这一优化称三级优化,在二级优化下进一步再优化,-03打开了-02的所有优化操作并打开了-finline-functions、-funswitch-loops、-fgcse-after-reload。