一、提要
1. 预处理(进行宏替换)
2. 编译(生成汇编)
3. 汇编(生成机器可识别代码)
4. 链接(生成可执行文件或库文件)
五六十年代,我们编程大多是二进制编程,也就是使用打孔纸带喂给机器
再往后,科学家们发明汇编语言
再往后,人们就发明了高级语言
提问:编译器什么时候有的?二进制编程需要编译器吗?
汇编语言时期出现了编译器,二进制则不需要
最早人们先用二进制写编译器,提供汇编语言进行编程,是先有语言的。
二、程序的翻译过程
翻译过程 | gcc命令 | 说明 |
预处理 | gcc -E test.c -o test.i | 宏替换,去注释,头文件展开 |
编译 | gcc -S test.i -o test.s | 将c语言变为汇编语言 |
汇编 | gcc -c test.s -o test.o | 汇编语言编译成二进制目标文件 |
链接 | gcc test.o / gcc test.o -o my.exe | 形成可执行程序 |
注:
1. -E 从现在开始进行程序的翻译,预处理完成就停下。
2. 条件编译 #ifdef ... #elif ... #else ... #endif ,代码裁剪,可以通过宏来为各种环境来定制代码
问:gcc能裁剪代码吗?
预处理的时候去注释,编译器优化代码,能改我们的代码,添加宏,所以可以
3. 链接--动静态链接--特点、区别
是什么? 程序和库结合的过程(语言一定要有自己的标准库)
Linux: 动态库: .so 静态库: .a
windows: 动态库 .dll 静态库: .lib
怎么办?链接时,有两种链接方式:动态链接 静态链接
动态链接:共享动态库,但是一旦动态库缺失,所有的动态链接这个库的程序,都无法执行了
静态链接:在编译的时候,把库中的方法拷贝到自己的可执行程序中,不在关心任何的库
gcc默认形成的可执行程序,默认采用动态链接
动态库&&动态链接的优缺点
1.不能丢失
2.节省资源
静态库&&静态链接的优缺点
1.一旦形成,跟库无关
2.浪费资源
三、Linux项目自动化构建工具-make/Makefile
make是一个命令;makefile是个文件,通过vim编辑
.PHONY:XXX
XXX对应的方法,总是要被执行的。
提问:为什么makefile对最新的可执行程序,默认不想重新形成呢?怎么做到的?
答:1.在企业中,通常大型文件编译时,需要几十分钟到几小时不等,甚至更多,为提升效率,还是很有必要的。2.对比,可执行文件的最近修改时间和源文件最近的修改时间,谁更新?