Linux下C语言的编译执行过程

今天闲来无事 玩了会C语言 国际惯例经典的 Hello World


以hello world为例 创建 hello.c文件 这个称为源文件

1
2
3
4
#include <stdio.h>
void main(){
printf("hello world");
}

gcc 基本用法 gcc [options] [filenames]
使用gcc 命令编译c文件 经过了以下几个阶段

预处理

预处理阶段 主要就是处理源文件中的一些预处理命令 如 #include等 可以使用 gcc-E 选项 对源文件只做预处理不进行编译 这个过程会成成一个 *.i的文件

1
2
3
[root@eiji c++]# gcc -E hello.c -o hello.i
[root@eiji c++]# ls
hello.c hello.i

-o 选项是把前面的编译内容输入到 hello.i 文件中
可以通过less或者cat等命令查看 hello.i 文件的内容

编译

编译阶段 主要就是上一步的预处理文件编译成汇编语言文件 可以使用 gcc-S 选项编译为汇编语言文件 这个过程会成成一个 *.s的文件

1
2
3
[root@eiji c++]# gcc -S hello.c -o hello.s
[root@eiji c++]# ls
hello.c hello.i hello.s

gcc -S 后这里是使用的 源文件 其实使用第一步生成的 hello.i 文件结果也是一样的
hello.s就是汇编语言文件了 也可以通过less或者cat等命令查看文件的内容

汇编

汇编阶段 主要就是把汇编文件 也就是上一步生成的 hello.s 文件当作输入 来生成 二进制机器码可以重定向目标文件 默认后缀 *.o的文件。可以使用 gcc-c 选项

1
2
3
[root@eiji c++]# gcc -c hello.c
[root@eiji c++]# ls
hello.c hello.i hello.o hello.s

查看内容会乱码吧 (不知道怎么处理了,囧)

链接

链接阶段主要就是把 上一步生成的重定向目标文件当作输入与其他的库文件等汇集成一个可执行目标文件(可执行二进制文件)

1
2
3
4
5
[root@eiji c++]# gcc hello.c -o helloworld
[root@eiji c++]# ls
hello.c hello.i hello.o hello.s helloworld
[root@eiji c++]# ./helloworld
hello world

刚刚回来看C语言 不是很懂 以后再补充吧!


-------------The End-------------