前言程序运行过程
最后
前言本篇博客是深入预处理的前导篇,主要是介绍 程序 的执行过程,主要使用 Linux 平台演示,具体为 CentOS7,以 C程序为例,通过对 程序执行过程的讲解,会穿插 预处理符的基本使用过程,以及 各个处理命令的基本使用。
程序运行过程程序的翻译运行过程:本质上就是把文本式的代码翻译成二进制代码的过程。
因为计算机在执行时,只认识二进制,所以编写的 高级语言代码,需要 编译器 将其 编译 成 二进制代码,这个过程分为以下四个阶段:
下面使用 test.c 进行演示处理过程
#include#define N 10 int main() { printf("n hello worldn"); printf("test1n"); printf("test2n"); printf("N=%dn",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 就可以了
感谢观赏,一起提高,慢慢变强



