1.gcc 的编译步骤
1)预处理
处理与#号相关的代码充电
gcc -E xxx.c -o xxx.i
2)编译
检查语法错误;
如果语法有误则报错,如果语法没错则编译成汇编语言
gcc -S xxx.i -o xxx.s
3)汇编
将汇编语言解析成二进制文件(并非纯粹的二进制文件)
gcc -c xxx.s -o xxx.o
4)链接
将目标文件链接库文件生成机器能够识别的二进制文件
gcc xxx.o -o xxxgcc的选项
-c,只编译,不连接成为可执行文件,编译器只是由输入的.c等源代码文件生成.o为后缀的目标文件,通常用于编译不包含主程序的子程序文件。
-o output_filename,确定输出文件的名称为output_filename,同时这个名称不能和源文件同名。如果不给出这个选项,gcc就给出预设的可执行文件a.out。
-g,产生符号调试工具(GNU的gdb)所必要的符号资讯,要想对源代码进行调试,我们就必须加入这个选项。
-O,对程序进行优化编译、连接,采用这个选项,整个源代码会在编译、连接过程中进行优化处理,这样产生的可执行文件的执行效率可以提高,但是,编译、连接的速度就相应地要慢一些。
-O2,比-O更好的优化编译、连接,当然整个编译、连接过程会更慢。
-I dirname,将dirname所指出的目录加入到程序头文件目录列表中,是在预编译过程中使用的参数。
-L dirname,将dirname所指出的目录加入到程序函数档案库文件的目录列表中,
2.make工具
Makefile的编写格式
格式:
目标:依赖
<tab> 命令
add:add.o main.o
gcc add.o main.o -o add
add.o:add.c
gcc -c add.c -o add.o
main.o
目标实现,需要通过依赖文件实现可以只有目标没有依赖。
1>有目标没有依赖
make执行Makefile文件内的指令,执行"make"默认执行的是第一个目标
对应的命令。若想执行剩余的目标,需要 "make 目标"执行。
.PHONY:clean -->.PHONY
声明一个伪命令。若之前的目标中有生成可知执行文件名为clean。
执行“make clean”时,make会认为clean目标已实现。不执行clean
目标对应的指令,用.PHONY声明后,make认为clean是一个指令,
“make clean”时会执行clean指令对应的命令。
2>有目标有依赖
目标:依赖
<tab>命令
一般是多个文件实现一项工程。对多个.c文件的管理。
变量
1)预定义变量
CC 默认值为cc,与gcc同
RM 默认值为rm -f
CFLAGS 无默认值,一般为c编译器的选项
OBJS 一般为目标文件xx.o2) 自动变量:
$< 第一个依赖文件的名称
$@ 目标文件的完整名称
$^ 所有不重复的目标依赖文件,
以空格分开% 匹配所有