Linux丰富精彩的世界中,经常看到高手们运行一些命令,哗啦啦的一屏屏的自动的开始运行。这些操作的一个最基本的源头就是GNU编译工具链。GNU编译器生成目标过程有很多阶段,大致可以分为四个:
1.预编译
gcc -E test.c -o test.i
我们编写一个简单的 打印hello world的test.c程序, 生成预编译好的test.i后, vim test.i可以看到原来短短不到5行的代码被预编译扩展 成将近1000行代码,是对#ifdef,#include,#define之类的预编译指令进行解析。
2.编译
接着我们生成的预编译好的test.i, 进行编译
gcc -S test.i -o test.s
这时来查看编译后的test.s, 发现内中代码很向汇编
3.汇编
让我们此时来真正汇编一把
gcc -c test.s -o test.o
此时高层代码test.c写成的程序思想已经实现到机器指令级别, 生成了目标文件test.o, 用文字编辑工具打开已经是乱码了。
4.链接
gcc test.o -o test
最终这才形成了可执行的二进制文件。
-------------------------
在保存头文件目录 home/inc 和保存源文件目录 home/src不是同一个目录的情况下,需要
gcc test.c -I ../inc -o test
如果在源程序文件和头文件内定义了符号常量
#define TEST_CONFIGURATION
编译时还可以指定符号常量
gcc -D TEST_CONFIGURATION test.c -o test
Q:编译阶段指定符号常量有什么优势?
W:不改变程序就改变程序的行为。
-------------------------
Q:优化?
A:大致是优化目标有三条路线:
1.速度更快, 文件更小;
2. 速度更快,但允许文件变大;
3. 减小文件大小,允许速度变慢;
有机会将会仔细讲述。