Linux基础3-基础工具3(make,makefile,gdb详解)

上篇文章:Linux基础3-基础工具2(vim详解,gcc详解)-CSDN博客

本章重点:

1.自动化构建工具make,makefile

2.linux调试工具gdb

目录

[一. 自动化构建工具make,makefile](#一. 自动化构建工具make,makefile)

[1.1 make使用](#1.1 make使用)

[1.2 使用make注意点](#1.2 使用make注意点)

[a. make和文件时间属性之间关系](#a. make和文件时间属性之间关系)

[b. make默认只会执行第一条文件,然后停止](#b. make默认只会执行第一条文件,然后停止)

[c. makefile的推导规则(类似于栈结构,新进后出)](#c. makefile的推导规则(类似于栈结构,新进后出))

[二. gdb](#二. gdb)

[2.1 gdb调试和windows调试(vs2022)](#2.1 gdb调试和windows调试(vs2022))

[2.2 创建debug版本文件](#2.2 创建debug版本文件)

[2.3 gdb命令使用](#2.3 gdb命令使用)

[三. 下章重点](#三. 下章重点)

[3.1 git的使用](#3.1 git的使用)

[3.2 冯诺依曼计算机体系结构](#3.2 冯诺依曼计算机体系结构)


一. 自动化构建工具make,makefile

make是一个命令,makefile是一个文件,也可命名为Makefile

当我们创建好makefile后,输入make 即可完成相应的工作

如帮我们完成编译,清理等工作

1.1 make使用

1.1 创建makefile和代码文件

1.2 完成代码文件

1.3 完成makefile文件

.PHONY**(上图输入错了,不应该是.PHONE,而是PHONY)**

该关键字修饰的是伪目标(表示该目标总是可以被执行的)

1.2 使用make注意点

a. make和文件时间属性之间关系

当我们make一次之后,不删除文件再次使用make,会显示test是最新的

gcc是如何知道我们不需要再次编译呢?(这个跟文件的时间属性有关,gcc会比较源文件和可执行文件的modify时间,如果时间不一样,就能够再次make。)

如:

在我们学习指令的时候,使用stat可以显示文件的三种时间:文件时间

Access time(最后一次访问时间):

Linux老内核,访问,读取文件频率很高,这样会频繁更新Access time,导致效率低

Linux新内核,只有经过一定次数的访问才会进行修改Access time

Modify time(最后一次修改文件时间):

Change time(最后一次修改文件属性时间):

所以当我们touch一下源文件(修改文件属性,不修改内容),就能够再次make

但是被 .PHONY修饰的文件,不遵守上述时间规则

b. make默认只会执行第一条文件,然后停止

这就是为什么,编译文件test.c直接make就行,而使用clean需要make clean

c. makefile的推导规则(类似于栈结构,新进后出)

gcc,依赖关系表

mycode依赖mycode.o,但是没有mycode.o

所以去执行mycode.o的依赖关系和依赖方法

最终按照依赖关系列表先执行mycode.i的依赖关系和依赖方法

二. gdb

2.1 gdb调试和windows调试(vs2022)

两种调试的思路上是一摸一样的,但是gdb调试是通过命名行的方法进行的,这需要我们掌握gdb调试的各种操作

2.2 创建debug版本文件

gdb调试的时候,默认情况下是无法调试的。需要gcc编译时候加上 -g 生成debug文件才能调试

gcc test.c -o test -g    //生成debug文件

debug版本:供程序员进行调试,增加调试信息

release版本:用户使用,不需要增加调试信息

在Linux中,gcc默认生成的版本是release版本,无法进行调试

举例:

为什么会存在debug和release两种版本呢?

程序员在开发软件的过程中需要进行调试,而用户不需要调试,用户只关心如何使用软件。

而且relese版本体积小于debug版本,也方便用户下载和存储

2.3 gdb命令使用

list l 查看代码(输入行号可以查看某一行代码,输入enter可以继续查看后续代码)

b + 行号 可以在这一行打断点

d + 行号 可以在这一行关闭断点

info + b 可以查看所有断点

r 调试运行(相当于shift+f5)

n 逐过程运行(f10)(遇到函数不会进入函数内部,而是直接运行完这条函数)

s 逐语句运行(f11)(遇到函数会进入函数内部)

c 由一个断点运行到下一个断点

finsh 直接运行到该函数运行完

bt 查看调用堆栈

p 变量 可以查看相应变量的值

display/undisplay 可以常显示/取消该变量

until + 行号 可以直接运行到这一行

三. 下章重点

3.1 git的使用

3.2 冯诺依曼计算机体系结构

相关推荐
摸鱼也很难1 小时前
Docker 镜像加速和配置的分享 && 云服务器搭建beef-xss
运维·docker·容器
watermelonoops1 小时前
Deepin和Windows传文件(Xftp,WinSCP)
linux·ssh·deepin·winscp·xftp
woshilys2 小时前
sql server 查询对象的修改时间
运维·数据库·sqlserver
疯狂飙车的蜗牛2 小时前
从零玩转CanMV-K230(4)-小核Linux驱动开发参考
linux·运维·驱动开发
恩爸编程3 小时前
探索 Nginx:Web 世界的幕后英雄
运维·nginx·nginx反向代理·nginx是什么·nginx静态资源服务器·nginx服务器·nginx解决哪些问题
Michaelwubo4 小时前
Docker dockerfile镜像编码 centos7
运维·docker·容器
远游客07134 小时前
centos stream 8下载安装遇到的坑
linux·服务器·centos
马甲是掉不了一点的<.<4 小时前
本地电脑使用命令行上传文件至远程服务器
linux·scp·cmd·远程文件上传
jingyu飞鸟4 小时前
centos-stream9系统安装docker
linux·docker·centos
好像是个likun5 小时前
使用docker拉取镜像很慢或者总是超时的问题
运维·docker·容器