Linux下gcc编译c文件为可执行文件分为四个步骤: 分别是 预编译、编译、汇编、链接。
1、预编译( 生成 hello.i 文件)
预编译的处理规则:
1. 将所有的 “#define” 删除,并展开所有的宏定义。
2. 处理所有的条件预编译指令,比如:" #if #ifdef #elif #else #endif "。
3. 处理所有的 “#include” 预编译指令。
4. 删除所有的注释 “//” 、 “/* */”。
5. 添加行号和文件名标识,以便编译时产生的行号信息以及用于编译错误或警告时能够显示行号。
6. 保留所有的 “#pragma” 编译器指令。
$ gcc -E hello.c -o hello.i 或者 $ gcc hello.c > hello.i
2、编译(生成汇编代码 hello.s)
编译过程是编译器gcc把预处理完的文件进行词法分析、语法分析、语义分析及优化后生成相应的汇编代码文件。
编译过程可以使用如下命令:
$ gcc -S hello.i -o hello.s 或者 $ gcc -S hello.c -o hello.s
都可以得到汇编输出文件 hello.s
3、汇编(生成hello.o文件)
汇编是 汇编器as 把汇编代码转变成中间目标文件。
汇编过程可以使用如下命令:
$ gcc -c hello.s -o hello.o 或者 $ gcc -S hello.c -o hello.o
可以得到中间目标文件
4、链接(生成可执行程序)
链接器 ld:负责将程序的目标文件与所需的所有附加的目标文件连接起来,附加的目标文件包括静态连接库和动态连接库。
链接是链接器ld把中间目标文件和相应的库一起链接成为可执行文件。
$ gcc hello.o -o hello
如果前面使用的是$ gcc hello.c命令,默认会产生一个a.out 的可执行文件,使用命令./a.out执行改可执行文件。
注:上述步骤可以放在一起执行
$ gcc hello.c -o hello./hello