一. Gcc 编译处理过程
下面以 helloworld 程序为例去进行解释过程:
其中hello.c的内容如下:#include<stdio.h>
int main()
{
printf("hello world\n");
}
第一步:预处理 -E
预处理阶段过程如下,预处理阶段是进行处理代码中的宏和 include 指令,并作语法检查。
这一过程的命令为:# gcc -E hello.c -o hello.i 执行这一部生成了一个hello.i 文件,如下:可以看到由于进行了预处理,将 include 内部的文件进行了替换,预处理后的结果文件显得特别大,
所以在以后的程序中,没有用到的头文件最好不要引入,这样会降低处理时间和空间。
第二步:汇编程序生成汇编码 -S
这一步是将预处理文件进行汇编, 生成汇编程序,命令如下:可以看出生成的汇编程序为19行。
第三步:由汇编程序转换为中间目标文件 -c
这一步是将汇编的代码进一步进行处理,每一个源程序都会生成相应的目标文件,是以 .o 为扩展名的文件。
命令如下:
第四步:连接目标文件,生成可执行程序 -o
这一阶段被称为链接阶段,这一阶段完成的是将目标文件进行连接生成相应的最终目标文件(可执行文件或静态库或动态库)
二. 常用步骤:
1. 直接生成可执行文件
三. GCC编译器的选项
-E 只进行预处理选项,不进行编译、汇编、以及连接
-S 编译后停止,不进行会变和连接
-c 编译或会汇编文件,但不进行连接
-o file 指定输出文件名
2. 警告选项
-Wall 启用所有警告信息
-Werror 在发生警告时取消编译操作,即将警报看作是错误
-w 禁用所有警告信息
3. 优化选项
-O0:不进行优化处理
-O或-O1:进行基本的优化,这些优化在大所属情况下都会使程序执行的更快
-O2:除了完成-O1级别的优化外,还需要一些其他的调整工作,如处理器指令调度等,只是GNU发布软件的默认优化
-O3:除了完成-O2级别的优化外,还进行循环的展开(这往往会提高执行速度)以及其他的一些预处理器相关的优化工作。
-Os:生成最小的可执行文件,主要用在嵌入式领域。
4. 连接器选项
-I directory 向GCC的头文件搜索路径中添加新的目录, 如: -I /user/QT/include
-L directory 向GCC的库文件搜索路径中添加一个行的目录,如:-L /lib/xxx.a
-llibrary 提示连接程序在创建可执行文件时包含指定的库文件,如:-libm.a
-static 强制使用静态库
-shared 强制使用共享库
5. 其他选项
-xlanguage 指定输入文件的编程语言
-v 显示编译器的版本号
-g 获得有关调试程序的详细信息
-ansi 支持符合ansi彼岸准的c 程序