Makefile详解和gdb使用

Makefile详解和gdb使用(Centos 7)

一、Makefile(makefile)

1.什么是makefile

makefile一般和make配套使用

简而言之,makefile是文件,make是一个命令

makefile创建在要编译的文件的同级目录下

优点:

  1. 管理代码的编译,决定该编译什么文件,编译顺序,以及是否需要重新编译;
  2. 节省编译时间。如果文件有更改,只需重新编译此文件即可,无需重新编译整个工程;
  3. 一劳永逸。Makefile通常只需编写一次,后期就不用过多更改。

2.makefile的语法

在这里插入图片描述

**依赖关系:**即目标文件由哪些文件生成(第一行)

**依赖方法:**即目标文件如何生成的(第二行)

依赖方法必须以Tab键为开头

两者缺一不可

make的执行

make是以栈式结构执行的

在这里插入图片描述

在这里插入图片描述

文件的清理

在这里插入图片描述

如果要对文件进行删除的话,就可以在后面加上clean的方法。

使用命令: make clean

在这里插入图片描述

make执行的规则

改变makefile的顺序:

在这里插入图片描述

执行make:

在这里插入图片描述

执行make mytest

在这里插入图片描述

结论:make的执行默认是最开始的

为什么不能连续make

在这里插入图片描述

1.在我们进行make命令后,再多次执行make命令的时候为什么不能呢?

2.make是怎么判断我已经执行过make命令呢?

a.为什不能再次执行make命令呢?

答案很简单,因为我们前面已经执行过这个命令编译过此文件了,而该文件没有进行改动,所以没有必要进行了。

b.make是怎么知道我的文件已经被修改过,是否要再次进行编译呢?

我们知道,在编译后目录中有两个文件,一个是源文件,一个是可执行文件

一般而言,源文件的修改时间是要早于可执行文件的

如果我们对源文件进行修改的话,此时源文件的修改时间就晚于可执行文件了,所以我们可以得出:

如果源文件的修改时间晚于可执行文件,我们就需要在进行make的编译,形成新的可执行文件。


我们可以采用 stat这个命令查看文件的时间

源文件:

在这里插入图片描述

可执行文件:

在这里插入图片描述

先下结论再解释这三个时间:

我们比较的是modify的时间,如果源文件的modify时间早于可执行文件,那么我们就不能在进行make编译

在这里插入图片描述

我们也可以看到再使用make命令的时候,报错的提示是 该文件时最新的,比较的就是时间。

c.为什么会有三个时间

**C.1 Access:**访问时间,就是用户访问文件的时间

在这里插入图片描述

奇怪的是为什么我们vim访问后,为什么Access访问时间还没有发生变化


原因:
因为用户经常会访问文件,但是这些时间都是存储在磁盘里的,如果访问一次就修改的话会频繁向磁盘里写入数据,会拖慢CPU的速度,所以会规定多次访问才会对时间进行修改更新。


C.2Modify和Change:

modify与change翻译过来的意思都一样,都是改变,修改的意思,那有什么不同呢?

我们都知道 文件=文件内容+文件属性

Modify对应修改的是文件的内容

Change对应修改文件的属性

Change:

在这里插入图片描述
我们可以看到通过改变文件的属性会使得Change的时间改变

Modify:

在这里插入图片描述

我对文件进行添加内容使得Modify时间改变,因为添加内容文件的大小也发生变化,所以Change也改变。

在这里插入图片描述
此时make命令也可以再执行。

补充知识:

对一个已经创建的文件,采用touch命令会更新三个时间

在这里插入图片描述

3.makefile的一些特殊符号

a.@:再进行make命令不再显示(不会回显)

在这里插入图片描述

b.$@ (冒号左侧) $^(冒号右侧所有文件)

在这里插入图片描述

C. #是注释

在这里插入图片描述
这里clean命令执行成功,如果失败,那么会报错。

D. .PHONY(伪目标):PHONY定义伪目标的命令一定会被执行

在这里插入图片描述

这样就不会报错,一般适用于clean函数前面

2.gdb

2.1什么是gdb

**概念:**GDB 全称“GNU symbolic debugger”,从名称上不难看出,它诞生于 GNU 计划(同时诞生的还有 GCC、Emacs 等),是 Linux 下常用的程序调试器。

2.2一些命令

如果我们简单的使用 gdb mytest(为编译好的可执行文件)

会出现以下的情况:原因就是我们在编译的时候默认是release版本(无调试信息)。

在这里插入图片描述

为了有调试信息,我们需要加入-g选项:

gcc -o mytest test.c -g


**list(简写 l)😗*输出上一次list命令显示的代码后面的代码,如果是第一次执行list命令,则会显示当前正在执行代码位置附近的代码,默认为10行输出。

在这里插入图片描述

run(简写为r): 默认情况下,以 gdb ./filename 方式启用GDB调试只是附加了一个调试文件,并没有启动这个程序,需要输入run命令(简写为r)启动这个程序:

在这里插入图片描述

**break(简写为b)😗*用于添加断点,可以在b的后面加上行号来添加断点,也可以在b后面加上函数名来添加断点(退出调试后断点不会保存)

在这里插入图片描述

**info b:**可以查看断点信息

在这里插入图片描述

**delete(简写为d):**删除断点,删除的时候后面跟的是在info b上看的断点序号。

在这里插入图片描述

**step(简写为s)😗*单步进行,逐语句遇到函数会进入

在这里插入图片描述
这里是进入了累乘的函数中逐步进行。

next(简写为n):逐语句进行,遇到函数不会进入

在这里插入图片描述

print(简称为p):打印变量的值

在这里插入图片描述

**display:**跟随着逐步或者逐语句一直打印不会和print命令一样消失
在这里插入图片描述

**undisplay:**不再打印变量值,和取消断点的方式一样都是undisplay编号

在这里插入图片描述

**until(简写u):**运行到指定行停下来

在这里插入图片描述

**finish:**让函数跑完

在这里插入图片描述

**continue(简写为c)😗*从一个断点到另一个断点

在这里插入图片描述

**disable:**让断点失效,同样是编号

在这里插入图片描述

**enable:**让断点重新有效,同样是编号

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值