表白:黑白圣堂血天使,天剑鬼刀阿修罗。 讲解对象:/C语言 预处理-编译-汇编-链接详细讲解 作者:融水公子 rsgz ===
C语言 预处理-编译-汇编-链接详细讲解 之前使用编译器 直接一步到位从.c文件得到.exe文件,那么这个转化过程中间经历了那些操作呢?有必要一探究竟
方式1 一步到位gcc hello.c -o hello.exe 方式2 四步转化 也就是说需要经过四个步骤转换才能得到exe 大家参考一下下面的流程图 一定要注意前面三个步骤 都是有参数的 后面的-o 只是用来重命名的
gcc -E hello.c -o hello.i // 得到头文件 预处理文件
gcc -S hello.i -o hello.s // 得到汇编文件
gcc -c hello.s -o hello.o // 得到目标文件
gcc hello.o -o hello.exe // 得到可执行文件 四个步骤的特点分析
1 预处理阶段 其实就是做了一个操作,展开一下头文件,将头文件里面的内容显示到当前的页面来 然后加上原来的函数 其次有一个特点就是 这个阶段不检查语法错误,换句话可以展开任何文件 如果编辑一个abc.txt文档 也能成功导入进去经过预处理后 会生成这样的hello.i文件 这个文件需要使用UltraEdit编辑器打开查看 查看内容 确实也能展开普通的文档 等于说钻了空子除了上面的演示 其实这个阶段还会进行下面的操作:
宏定义替换#include <stdio.h>
#define PI 3.14
int main(void){
printf("%d\n", PI);
return 0;
} 预处理一下gcc -E hello.c -o hello.i -I . // 得到头文件 预处理文件 -I . 指定头文件位置 打开预处理文件 可以看到 宏替换了 也就是将宏名 替换成 宏 值替换注释 注释部分预处理文件会变成这样 特点就是注释部分被替换成空行了
展开条件编译 下面的意思就是 如果定义了PI 就打印括号里面的字符串到控制台里面 换句话说如果定义了PI 就打印 没有定义就不打印
# define PI 3.14
#ifdef PI
printf("----------666\n")
#endif 看预处理结果 就知道#ifdef或者#endif都消失了 直接打印了字符串这个过程即便是有语法错误 只是会好心提示一下 但是仍然会生成预处理文件
2 编译阶段 经过编译后会出现汇编文件 这个文件函数没有那么多几十行 这是C语言出现之前就已经出现的语言了 所有的计算机语言里面最接近底层的语言 这个过程主要是 1 能判断语法错误 如果你的代码里面少了关键的标点符号 那么编译阶段就会出现error报错,它是一行行的检查语法错误,也是整个编译过程中最耗时的操作 2 如果没有错误的情况下 将C代码翻译成汇编指令 最后得到.s 汇编文件 汇编阶段 汇编阶段会生成.o文件 这是一个二进制文件 人类完全看不懂的存在 本质上也是机器指令 只不过 是机器指令的二进制文件, 但是文本编辑器 里面可以用十六进制显示
链接阶段 这个阶段比较复杂 直接说结论: 1 数据段的合并 2 数据地址的回填 3 库引入
结合上面的所有理解 那么整个程序生成的过程 可以按照下面的流程 === 公众号:不浪仙人 谢谢大家的支持!可以点击我的头像,进入我的空间浏览更多文章呢。建议大家360doc[www.360doc.com]注册一个账号登录,里面真的有很多优秀的文章,欢迎大家的到来。 --- ';
|