编译工具链
高级语言翻译成机器语言不是一步到位的,以C语言为例,通常要经历以下四个步骤:
代码语言:javascript复制预处理--->编译--->汇编--->连接
源代码--->汇编代码--->目标代码--->可执行程序
每一步都需要使用不同的工具,比如源代码需要借助编译工具翻译成汇编代码,汇编代码需要借助汇编器翻译成目标代码,最后还要借助连接器帮忙整理汇总, 那么这些个工具集合到一块就叫做工具链
GCC工具链
由GNU提供的一整套的工具集,这套工具集中包含了汇编器,编译器和链接器,二进制转换,调试工具等
通过GCC,我们可以一步完成源码到可执行文件的编译, 也可以单步独立进行,方便程序员获取中间代码代码,进行调试
GCC常用命令选项
假设只编译单个源文件test.c
无选项编译
在当前目录下直接生成可执行文件,默认名称为a.out
选项-o
在当前目录下生成名为test
的可执行文件
选项-E
在当前目录下生成名为test.i
的预处理文件
选项-S
在当前目录下生成名为test.s
的汇编文件,将源码转成汇编代码
选项-c
在当前目录下生成名为test.o
的目标文件
选项-O数字
在当前目录下生成名为test
的可执行文件,并且使用编译优化级别1编译程序。可选级别为1~3,级别越大优化效果越好,但编译时间越长。
多文件编译
比如一个汇编文件aaa.s
一个C源文件test.c
:
方式一 多文件同时编译
代码语言:javascript复制gcc aaa.s test.c -o bbb
方式二 多文件分开编译
代码语言:javascript复制gcc -c aaa.s //生成aaa.o
gcc -c test.c //生成test.o
代码语言:javascript复制gcc test.o aaa.o -o test
方式三 编写makefile文件进行编译
代码语言:javascript复制# 我是注释
SRC=aaa.s test.c
main: $(OBJS) #指定需要生成的文件名称以及相应的依赖关系
gcc -o main $(SRC) #生成所需要的指令
代码语言:javascript复制# cs-make
以上三种方法相比较,第一中方法编译时需要所有文件重新编译,而第二种方法可以只重新编译修改的文件,未修改的文件不用重新编译 ,第三种方法适用于文件较多依赖关系复杂的工程编译