GCC是一个强大的编译器工具链,包含许多有用的工具,主要是4个,预处理器cpp,编译器egcs,汇编器as,连接器ld。意思就是说我们的源代码依次经过这四个工具就可以产生可执行文件了。
对于这四个工具的用法,我的理解是,可以分别使用这四个工具单独工作,也就是你一个一个的调用,比如:
cpp 参数 目标文件1 代码文件 //预处理
egcs 参数 目标文件2 目标文件1 //编译成汇编代码.s文件
as 参数 目标文件3 目标文件2 //汇编成目标文件.o文件
ld 参数 目标文件4 目标文件3 //连接成.a可执行文件
即每一个步骤都要依赖上一个文件产生的结果。
上述使用的方法我见得比较少,尽管上述步骤非常符合我们的思维习惯。
但是GCC就是GCC,他给了我们一种很好的方式,即直接使用gcc这个命令,如下:
gcc 参数 目标文件 代码文件
gcc命令的好处就在于编译的步骤仅由gcc的参数决定,这些参数指定了编译的步骤,这里说的步骤主要指你可以通过参数只是gcc在上述4个步骤那一个结束。
因而,编译程序的繁琐工作就仅需要我们关注gcc的参数了。
好啦,下面就要开始介绍gcc的各种参数的功能的。
先介绍控制编译流程的参数
1、进行到预处理结束 -E
gcc -E hello.c -o hello.i
上述命令 中的-E指示工具链把hello.c进行到预处理后结束(预处理已经执行),并生成预处理文件hello.i文件(-o参数是指定文件名字的选项)。这里有必要谈谈预处理的概念,我的简单理解就是把程序中包含的头文件、预定义宏什么的插入到代码中。
2、进行到编译结束 -S
gcc -S hello.i -o hello.s 或者
gcc -S hello.c -o hello.s
将hello.c弄成汇编代码,在调试程序时有可能查看该文件,生成.s汇编代码文件
3、进行到汇编结束 -c
gcc -c hello.s -o hello.o
gcc -c hello.i -o hello.o
gcc -c hello.c -o hello.o
将hello.c弄成.o目标文件,这个文件是要连接成可执行文件的
4、进行到可执行文件结束
gcc hello.o -o hello.a
gcc hello.s -o hello.a
gcc hello.i -o hello.a
gcc hello.c -o hello.a
就是出于下级的步骤可以使用其上级的所有生成的文件,也可以跳过级别直接使用其上上级的文件,因为如果没有相应的文件,gcc会自动生成相应的文件,千万不要认为有些步骤跳过了。
以上就是控制工具链流程的相关参数了,其中稍微比较额外一点的是-o这个参数,他为生成的文件指定一个名字,容易混淆的是好多人把它和.o目标文件联系起来,其实他俩没有关系。
今天就到这里了
声明:非常感谢无名网友博客和论坛提供的大量的学习资料,以上全部学习笔记来自网络资料学习