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 冯诺依曼计算机体系结构

相关推荐
轩轶子2 小时前
【C-项目】网盘(一期,无限进程版)
服务器·c语言·网络
S+叮当猫3 小时前
第五部分:2---信号的介绍、产生、处理
linux·运维·服务器
东城绝神4 小时前
《Linux运维总结:基于ARM64+X86_64架构CPU使用docker-compose一键离线部署mongodb 7.0.14容器版副本集群》
linux·运维·mongodb·架构
WZF-Sang6 小时前
Linux权限理解【Shell的理解】【linux权限的概念、管理、切换】【粘滞位理解】
linux·运维·服务器·开发语言·学习
小橞6 小时前
Linux搭建简易路由转发
linux·运维·服务器
嵌入式DZC6 小时前
搭建内网文件服务器(FTP),以及实现内网Gitee
运维·服务器
robot_大菜鸟7 小时前
linux-L7-linux 查看json文件
linux·运维
Flying_Fish_roe7 小时前
linux-网络管理-网络抓包
linux·网络·php
小技与小术8 小时前
lvs-nat模式实验详解
linux·运维·服务器·网络·lvs
FreeBuf_8 小时前
SSHamble:一款针对SSH技术安全的研究与分析工具
运维·安全·ssh