0%

PA0

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:
# 编译规则1
target2:
# 编译规则2

变量

  • 变量赋值
    • := :直接赋值
    • = :变量的值是整个Makefile中最后被指定的值
    • ?= :如果该变量没有被赋值,则赋值予等号后面的值
    • += :将符号后面的值添加到前面的变量上
  • 变量调用 $(VAL)
    • $< 代表第一个依赖文件
    • $^ 表示所有的依赖文件
    • $@ 表示生成的目标文件
1
2
SRC = $(wildcard *.c) # 通配符
OBJ = $(patsubst %.c, %.o, $(SRC)) # 取出SRC中的所有值,将.c 替换为.o,最后赋值给OBJ变量

伪目标

  • 伪目标(如clean)没有依赖文件,只有用make来调用时才会执行。
  • 当目录下有与clean同名的文件时,执行make clean就会出现错误,此时需要使用伪目标
1
.PHONY: clean

回显

makefile里执行的命令都会打印在终端,若不需要打印则在命令前加@

1
2
clean:
@rm -rf ./*.o

嵌套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