![90a2ea8e7d6266033011913c00ebe332.png](https://i-blog.csdnimg.cn/blog_migrate/9fdc00f6236a2e98ac9f803146824b0e.png)
前言
C语言程序从源代码到二进制行程序都经历了那些过程?本文以Linux下C语言的编译过程为例,讲解C语言程序的编译过程。
编写hello world C程序:
// hello.c
#include <stdio.h>
int main(){
printf("hello world!n");
}
编译过程只需:
$ gcc hello.c # 编译
$ ./a.out # 执行
hello world!
这个过程如此熟悉,以至于大家觉得编译事件很简单的事。事实真的如此吗?我们来细看一下C语言的编译过程到底是怎样的。
上述gcc命令其实依次执行了四步操作:
- 预处理(Preprocessing)
- 编译(Compilation)
- 汇编(Assemble)
- 链接(Linking)
![bea15dbbff8d292e41e3fc0b0b579705.png](https://i-blog.csdnimg.cn/blog_migrate/b462d5e41379ec7a5669c971f92e9de6.png)
示例
为了下面步骤讲解的方便,我们需要一个稍微复杂一点的例子。假设我们自己定义了一个头文件mymath.h
,实现一些自己的数学函数,并把具体实现放在mymath.c
当中。然后写一个test.c
程序使用这些函数。程序目录结构如下:
├── test.c
└── inc
├── mymath.h
└── mymath.c
程序代码如下:
// test.c
#include <stdio.h>
#include "mymath.h"// 自定义头文件
int main(){
int a = 2;
int b = 3;
int sum = add(a, b);
printf("a=%