前提 gcc编译时要加命令行参数 -g
进入 gdb + 加参编译后的可执行文件
l(list) 列处包含main函数的源文件(默认列处10行,回车继续) 后面加源文件名会列出该源文件,加**:**后再加具体函数名会列出该函数的内容。
b(break) number 设置断点 后面加if (i == 15) 设置条件断点
d(delete) + 变量编号 可以取消为该编号的断点行数
i(info) 查看信息 后面加b 查看断点信息
start 只执行一步 n 下一步(next)
r(run) 直接运行,有断点停止
c(continue) 继续执行,遇到断点停止
s 进入函数体内 + l 查看其详细内容
p(print) + 具体变量名 可以追踪其内容。
ptype + 具体变量名 可以查看其数据类型
display + 具体变量名 可以每步都打印其信息 undisplay + 编号 可以取消追踪为该编号的变量
info display 则可以查看被追踪变量的具体编号
u 跳出该循环(c中的break)
finish 跳出当前函数,回到主函数(前提: 去掉跳出该函数时可能会遇到的断点)
set + 变量名(赋值操作) 可以直接设置该变量的值
quit 跳出gdb状态
目标(生成的可执行文件名) 依赖(待编译的源文件) 命令(具体实施步骤)
#目标: 依赖条件
# (有tab缩进)命令
app:main.c file1.c file2.c
gcc main.c file1.c file2.c -o app
#最简单的makefile文件
如果我们使用makefile文件编译了多次,为了防止重复编译,我可以将依赖分开(能够直接比较目标和依赖的修改日期来达到目的)
app:main.o file1.o file2.o
main.o:main.c
gcc -c main.c
#这是生成二进制文件的命令
file1.o:file1.c
gcc file1.c -o file1.o
#两种写法皆可
file2.o:file2.c
gcc -c file2.c
make 在有makefile和源文件的文件夹中,命令行使用该命令可以直接生成可执行文件. 当然如果makefile文件没有命名成makefile或Makefile, 我们可以通过加参来达到使用makefile文件的目的。
make -f makefile_namebyself
make clean 该命令可以执行makefile下的定义的清除操作. 具体操作内容的书写方法如下:
.PHONY : clean
#添加伪目标是防止同目录下存在clean文件影响命令执行
clean:
rm app main.o file1.o file2.o
- 该参数表示该命令执行错误时,跳过该命令执行后面的命令.
@ 该参数表示该命令执行时不会将执行过程打印在终端上.
两个命令都是加在命令前的, 例如:
-rm app main.o
像编程语言一样,makefile中也可以定义变量来简化书写.
obj = main.o file1.o file2.o
当我们要使用该变量时,使用如下方法取出该变量里面的值:
$(obj)
obj = $(obj)
有一些系统自带的变量,这些变量通常都是大写,这些变量中有些默认值,但都支持修改。
例如: CC, PWD, CFLAG
makefile中提供了许多比较方便的自动变量,常用的有如下:
$@ 规则中的目标
$< 规则中的第一个依赖
$^ 规则中的所有依赖
%.c/%.o 规则中所有的该类依赖
所以上面makefile文件中向下寻找依赖的代码可简写成以下形式:
%.o:%.c
$(CC) -c $^ -o $@
这种书写形式也被称作模式规则.
makefile中有大量函数,经常使用的有如下三个:
wildcard 用于展开某文件的信息.
#示例用法
obj = $(wildcard ./src/*.c)
#查找src目录下的所有c源文件,并路径信息赋值给变量obj
notdir 将路径信息直接更改成文件名
#示例用法
file = $(notdir $(obj))
#将obj里的路径信信息替换成文件名
patsubst 替换通配符.
#示例用法
obj = $(patsubst %.c, .%.o, $(src))
#将src目录下的所有.c文件替换成.o文件,并将.o文件赋值给obj1变量.
#这里的替换不是直接修改文件格式,而是将文件字符串修改并返回,目的是为了方便书写.
#效果相似于
obj = $(file:%.c = %.o)
#将变量中c源文件替换成二进制源文件