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