一、gcc编译工具
预处理:主要处理#开头的语句,展开头文件,替换宏定义,不会进行语法检查。
gcc -E xx.c -o xx.i
编译:检查语法错误,词法错误,将.文件转换成.s汇编文件。
gcc -S xx.i -o xx.s
汇编:将汇编文件转换成二进制文件(不可执行)
gcc -c xx.s -o xx.o
链接:链接库文件,将不可执行的二进制文件转换成可执行的二进制文件。
gcc xx.o -o xx
gcc xx.c 默认生成a.out
gcc xx.c -o xx 生成一个新名字的可执行文件
二、gdb调式工具
gcc -g xx.c 生成a.out
gdb a.out
r: 运行代码
l: 查看文件
b 行号或者函数名:添加断点
info b:查看断点情况
d num(断点编号):删除断点
p 变量名:查看变量的值
s/n: 单步运行,s会进入子函数顺序执行;单步跳过,n不会进入子函数
c: 执行到下一个断点的位置
help:帮助
q: 退出
步骤:代码写好后,先通过gcc -g进行编译代码,没有错误后,可以通过gdb a.out进行调试,输入l查看文件内容,通过b设置断点,输入r进行运行,n或s进行单步调试,q退出。
三、make调试工具
3.1 定义
make: 工程管理器,顾名思义,是指管理较多的文件。
make工程管理器也就是个“自动编译管理器”,这里的“自动”是指它能构根据文件时间戳自动发现更新过的文件而减少编译的工作量,同时,它通过读入Makefile文件文件的内容来执行大量的编译工作。
Makefile或makefile时make读取的唯一配置文件。
3.2 makefile格式
目标:依赖
命令
注意:命令前需要用TAB键
理解:通俗一点讲依赖(相当于原材料) --> 命令(加工过程) --> 目标(产物)
makefile 根据以下步骤编写:
gcc -c xx.c -o xx.o
gcc xx.o -o xx
例如:写一个test.c文件,再写一个makefile文件
makefile文件如下;
test:test.o
gcc test.o -o test
test.o:test.c
gcc -c test.c -o test.o
然后使用make命令。
伪目标:伪目标的目的不是为了创建文件,而是为了去执行这个目标之下的命令。
例如:
执行:make clean
规则中 rm 命令不是为了创建 clean 这个文件,而是执行删除某些文件的任务。当工作目录中不存在以 clean 命令的文件时,输入 make clean 命令,命令 rm -rf *.o test 总会被执行 ,这也是我们期望的结果。
如果避免同名文件可以加:.PHONY:clean
3.3 make管理多个文件
1)先建立多个文件夹
2)写一个makefile管理
3)执行make
3.4 makefile变量
3.4.1 自定义变量
一般用大写表示变量名,取值用$
1) = 递归方式
2) :=直接赋值
3) +=追加新值
4) ?=判断之前变量是否被定义,若没定义则重新赋值;若定义了则不重新赋值
补充:-s选项作用是只输出结果不展示执行命令的过程
3.4.2 预定义变量
RM 文件删除程序的名称,默认值为rm -f
CC C编译器的名称,默认值为cc
CPP C预编译器的名称,默认值为$(CC) –E
CFLAGS C编译器的选项,无默认值
OBJS 生成的二进制文件或目标文件,自己定义
3.4.3 自动变量
$< 第一个依赖文件的名称
$^ 所有不重复的依赖文件,以空格分开
$@ 目标文件的完整名称
可以用%.c和%.o代替每一个.c文件和.o文件:相当于让每个.c生成各自的.o
3.5 make指令
make -s: 隐藏执行的指令
make -C 路径:进入指定路径执行make指令