文章目录- 一、知识铺垫
- 1.预处理
- 2.编译
- 3.汇编
- 4.链接
- 二、函数库
- 1.动态库
- 2.静态库
- 三、g 的基本使用
- 四、总结
- 1.预处理
- 2.编译
- 3.汇编
- 4.链接
- 1.动态库
- 2.静态库
一、知识铺垫
重新简单回顾一下编译链接的过程
1.预处理
预处理功能主要包括宏定义,文件包含,条件编译,去注释等。 选项“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程。 选项“-o”是指目标文件,“.i”文件为已经过预处理的C原始程序
头文件展开,去注释,宏替换,条件编译
代码语言:javascript复制gcc -E test.c -o test.i
-E:从现在开始,进行程序的翻译,当你将预处理做完,就停下来
-o:指明形成的临时文件名称(.i)
- 头文件的展开
此时生成test.i,我们用vim进入test.i,在利用底行模式vs test.c:
同时,在预处理阶段完成了宏替换、去注释以及条件编译:
- 条件编译的生效(宏的命令行定义)
可以向编译器传参来保证宏在命令行中定义
2.编译
在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc 把代码翻译成汇编语言。 用户可以使用“-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码
把C转换成汇编
代码语言:javascript复制gcc -S test.i -o test.s
S:从现在开始,进行程序的翻译,做完编译工作,变成汇编之后,就停下来
用vim打开test.s我们就可以看到汇编代码了:
3.汇编
把汇编变成二进制(不是可执行,二进制目标文件)
代码语言:javascript复制gcc -c test.s -o test.o
c:从现在开始,进程程序的翻译,做完汇编工作,变成可重定向目标二进制,就停下来
然后我们用vim打开test.o,但是我们根本看不懂:
在输入指令od test.o:
注意:前面三个只在翻译代码
其实这三步也就相当于键盘的左上角ESc