上篇文章: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 + 行号 可以直接运行到这一行