gcc的流程
预处理 -E .i
编译 -s .s 把c语言编译为汇编
汇编 -c .o 把汇编编译为二进制
链接
工程管理软件,它可以根据文件的时间戳进行编译,根据文件结构编译
app:main.o add.o
gcc main.o add.o -o app
main.o:main.c
gcc -c main.c -o main.o
add.o:add.c
gcc -c add.c -o add.o
.PHONY:clean 伪目标
clean:
rm *.o app
自动变量
$* 不包含扩展名的目标文件名称
$+ 所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件
$< 第一个依赖文件的名称
$? 所有时间戳比目标文件晚的的依赖文件,并以空格分开
$@ 目标文件的完整名称
$^ 所有不重复的目标依赖文件,以空格分开
$% 如果目标是归档成员,则该变量表示目标的归档成员名称
万能模版
OBJS=$(patsubst %.c,%.o,$(wildcard src/*.c))
CC=gcc
CFLAGS= -Wall -O -g -I ./include
APP=app
$(APP):$(OBJS)
$(CC) $(CFLAGS) $^ -o $@
.PHONY:clean
clean:
$(RM) *.o $(APP)
gdb调试
编译时需要加-g
运行 gdb a.out
b 设置断点
r 运行
n/s 单步运行
c 恢复运行
l 查看文件
info b 查看断点位置
p 查看变量值