前言
本篇博客是深入预处理的前导篇,主要是介绍 程序 的执行过程,主要使用 Linux 平台演示,具体为 CentOS7,以 C程序为例,通过对 程序执行过程的讲解,会穿插 预处理符的基本使用过程,以及 各个处理命令的基本使用。
程序运行过程
程序的翻译运行过程:本质上就是把文本式的代码翻译成二进制代码的过程。
因为计算机在执行时,只认识二进制,所以编写的 高级语言代码,需要 编译器 将其 编译 成 二进制代码,这个过程分为以下四个阶段:
下面使用 test.c 进行演示处理过程
#include <stdio.h>
#define N 10
int main()
{
printf("\n hello world\n");
printf("test1\n");
printf("test2\n");
printf("N=%d\n",N);
return 0;
}
- 预处理
将代码进行预先处理,包含四个最主要操作,在Linux下编译就可以看到效果:gcc -E test.c -o test.i
- 头文件展开
- 去注释
- 宏替换
- 条件编译
- 编译
将预处理后的C语言编译成汇编语言,也使用可以根据 .c 文件(自动先预处理,然后编译) 或是 .i 文件进行编译处理,生成 .s 文件,命令:gcc -S test.i -o test.s
- 汇编
处理汇编文件,将上面得到的 汇编文件 进行 汇编处理,生成 可重定向的二进制文件,即 .o 文件并不是可执行文件,而是 可链接文件(无法直接执行),gcc -c test.s -o test.o
Linux od命令用于输出文件内容。od指令会读取所给予的文件的内容,并将其内容以八进制字码呈现出来。
- 链接
链接主要的库文件,将自身程序和库文件进行关联(关联分为静态链接和动态链接),因为在代码编写时调用了很多 标准库函数,使用库文件可以很好的提高效率,而且代码 健壮性 也更好。直接使用gcc test.o -o test
就可以生成一个名为 test的可执行文件了,如果不适用-o test
来指定名字,就默认生成a.out
可执行文件
可以使用ldd test
来查看该可执行程序 依赖的库
所以一般在使用的时候,gcc test.c
就会直接上面四步,生成默认可执行文件 a.out,如果直接使用 gcc test.c -o test
就生成一个名为 test 的可执行文件。
上面的四个步骤的记忆重点是使用的参数,要记忆就记得 ESc 就可以了
最后
感谢观赏,一起提高,慢慢变强