GCC
1 2 3 4 5
| gcc -E hello.c -o hello.i 预处理,生成.i文件(头文件、宏展开等) gcc -S hello.i -o hello.s 编译,生成.s汇编文件 gcc -c hello.s -o hello.o 编译,生成.o可重定向目标文件 gcc hello.o -o hello 链接,生成可执行文件(将目标代码和所需要的库链成一个完整的应用程序) gcc hello.c -o hello 直接编译链接成可执行目标文件
|
GCC
Makefile
语法规则
1 2 3 4 5
| all: target1 target2 target3 target1: target2:
|
变量
- 变量赋值
:= :直接赋值
= :变量的值是整个Makefile中最后被指定的值
?= :如果该变量没有被赋值,则赋值予等号后面的值
+= :将符号后面的值添加到前面的变量上
- 变量调用
$(VAL)
$< 代表第一个依赖文件
$^ 表示所有的依赖文件
$@ 表示生成的目标文件
1 2
| SRC = $(wildcard *.c) OBJ = $(patsubst %.c, %.o, $(SRC))
|
伪目标
- 伪目标(如
clean)没有依赖文件,只有用make来调用时才会执行。
- 当目录下有与
clean同名的文件时,执行make clean就会出现错误,此时需要使用伪目标
回显
makefile里执行的命令都会打印在终端,若不需要打印则在命令前加@
嵌套Makefile
。。。
Makefile
GDB
要使用GDB调试某个程序,编译时必须加上编译选项 **-g**,否则程序不包含调试信息。
run(r)
list(l)
break(b)
b FuncName or b FileName:FuncName :在(指定文件)函数入口添加断点
b Line or b FileName:Line:在(指定文件)行号处添加断点
b -/+offset :在当前程序暂停位置的前/后 offset 行处下断点
info break or i b :显示当前所有断点信息
delete(d)/disable/enable BreakPointNum :禁用/启用/删除断点
until(u)
continue(c) next(n) step(s) jump(j)
print(p) watch
backtrace(bt) frame(f)
return finish(fi)
help(h)
| 命令名称 |
命令缩写 |
命令说明 |
| run |
r |
运行程序 |
| list |
l |
显示源码 |
| break |
b |
添加断点 |
| delete |
d |
删除某个断点 |
| enable |
enable |
启用某个断点 |
| disable |
disable |
禁用某个断点 |
| until |
u |
运行到指定行停下来 |
| continue |
c |
让暂停的程序继续运行 |
| next |
n |
运行到下一行 |
| step |
s |
单步执行,遇到函数会进入 |
| jump |
j |
将当前程序执行流跳转到指定行或地址 |
| print |
p |
打印变量或寄存器值 |
| watch |
watch |
监视某一个变量或内存地址的值是否发生变化,发生变化时GDB中断 |
| backtrace |
bt |
查看当前线程的调用堆栈 |
| frame |
f |
切换到当前调用线程的指定堆栈 |
| finish |
fi |
执行到当前函数返回后停止,回到上一层调用函数处 |
| return |
return |
立即中断当前函数并返回,到上一层函数调用处 |
| thread |
thread |
切换到指定线程 |
| tbreak |
tb |
添加临时断点 |
| info |
i |
查看断点 / 线程等信息 |
| ptype |
ptype |
查看变量类型 |
| disassemble |
dis |
查看汇编代码 |
| set args |
set args |
设置程序启动命令行参数 |
| show args |
show args |
查看设置的命令行参数 |
GDB