Linux(三) makefile与gdb调试

news2025/3/11 3:27:56

makefile

mkefile文件中定义了一系列的规则来指定,哪些文件需要线编译,哪些后编译,哪些需要重新编译,甚至进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。

mkefile带来的好处就是“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大提高了软件开发的效率。

make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如visual c++的nmake,Linux下GNU的make,可见,makefile都成为了一种在工程方面的编译方法。
makefile文件中会使用gcc编译器对源代码进行编译,最终生成可执行文件或者库文件。
makefile文件的命令:makefile或者Makefile

makefile的工作原理

若想生成目标,检查规则中的所有的依赖条件是否都存在:
在这里插入图片描述

如果有的依赖条件不存在

向下搜索规则,看是否有生成该依赖条件的规则:
如果有规则用来生成该依赖条件,则执行规则中的命令生成依赖条件
如果没有规则用来生成该依赖文件,则报错

如果所有依赖条件都存在

检查规则中的目标是否需要更新,必须先检查它的所有依赖,依赖中有任何一个被更新,则目标必须更新(检查的规则是哪个时间段哪个更新)

  • 如果目标的时间>依赖时间,不更新
  • 如果目标的时间<依赖时间,则更新

makefile的基本规则

makefile由一组规则组成,规则如下:

目标: 依赖
(tab)命令

基本规则三要素

  • 目标:要生成的目标文件
  • 依赖: 目标文件由哪些文件生成
  • 命令: 通过执行该命令由依赖文件生成目标

mkefile不同版本写法

现有main.c,fun1.c,fun2.c ,head.h三个文件
在这里插入图片描述

第一个版本

vi makefile
内容:

main:main.c fun1.c fun2.c
	gcc -o main main.c fun1.c fun2.c

第二个版本

 main:main.o fun1.o fun2.o
     gcc -o main main.o fun1.o fun2.o
 main.o:main.c
     gcc -c main.c -I./
 fun1.o:fun1.c
     gcc -c fun1.c
 fun2.o:fun2.c
    gcc -c fun2.c

在这里插入图片描述
分步写,如果中间量更改,可以减少重新编译的内容

第三个版本

makefile的变量

在makefile中使用变量有点类似于C语言中的宏定义,使用该变量相当于内容替换,使用变量可以使makefile易于维护,修改起来简单
makefile有三种类型的变量

  • 普通变量
  • 自带变量
  • 自动变量
普通变量
  • 变量定义直接用 =
  • 使用变量值用 $(变量名)
自带变量

makefile中也提供了一些变量(变量名大写)供用户直接使用,我们可以直接对其进行赋值

CC = gcc #arm-linux-gcc
CPPFLAGS:C预处理的选项有 -I
CFLAGS: C编译器的选项 -Wall -g -c
LDFLAGS: 链接器选项 -L -l
自动变量
  • $@:表示规则中的目标
  • $<:表示规则中的第一个条件
  • $^:表示规则中所有条件,组成一个列表,以空格隔开,如果这个列表中有重复的项则消除重复项
    自动变量只能在规则中的命令中使用
模式规则

至少在规则的目标定义中要包含%,%表示一个或多个,在依赖条件中同样可以使用%,依赖条件中的%取决于其目标
根据makefile的变量进行替换
在这里插入图片描述
在这里插入图片描述
利用变量进行更改,可以减少代码量

第四个版本

makefile函数

wildcard 查找指定目录下的指定类型的文件
src=$(wildcard *.c) //找到当前目录下所有后缀为.c的文件,赋值给src
patsubst 匹配替换
obj=$(patsubst %.c,%.o,$(src)) //把src变量里面所有后缀为.c的文件替换成.o

在makefile中所有的函数都是有返回值的
在这里插入图片描述

第五个版本

makefile的清理操作

用途:清楚编译生成的中间.o文件和最终目标文件
make clean 如果当前目录下有同名clean文件,则不执行clean对应的命令,解决方案:
伪目标声明:
.PHONY:clean
声明目标伪伪目标之后,makefile将不会检查该目标是否存在或者该目标是否需要更新

clean命令中的特殊符号
  • “-”此条命令出错,make也会继续执行后续的命令
  • “@”不显示命令本身,只显示结果。
其它
  • make 默认执行第一个出现的目标,可通过make dest 指定要执行的目标
  • make -f:-f执行一个makefile文件名称,使用make执行的指定的makefile:如make -f xxx(xxx是一个makefile文件,可以随意取名)
    在这里插入图片描述
    在这里插入图片描述

gdb调试

gdb介绍

GDB(GNU Debugger)是GCC的调试工具。其功能强大
GDB主要功能:

  • 启动程序,可以按照你的自定义的要求随心所欲的运行程序
  • 可让被调试的程序在你的自定义的要求随心所欲的运行程序
  • 当程序被停止时,可以检查此时你的程序中所发生的事
  • 动态的改变你程序的执行环境

生成调试信息

一般来说GDB主要调试的是C/C++的程序。要调试C/C++的程序,首先在编译时,我们需要把调试信息加入到可执行文件。使用编译器(cc/gcc/g++)的-g参数可以做到这一点。

gcc -g hello.c -o hello

如果没有-g,你将看不见程序的函数名、变量名,所代替的全是运行时的内存地址。

启动gdb

启动gdb : gdb program
program也就是你的执行文件,一般在当前目录下
设置运行参数
set args 可指定运行时参数。(如:set args 10 20 30 40 50)

显示源代码

GDB可以打印出所有调试程序的源代码,当然,在程序编译时一定要加上-g参数。
当程序停下来以后,可以通过list命令来打印程序的源代码
用法如下:

  • list linenum :打印第linenum行的上下文内容
  • list function:显示函数名为function的函数的源程序
  • list:显示当前行后面的源程序
  • list -:显示当前文件开始处的源程序
  • list file:linenum:显示file文件下第linenum行
  • list file:function:显示file文件的函数名为function的函数的源程序
    一般打印当前行的上5行和下5行,默认是10行
    使用下面的命令可以设置一次显示源程序的函数
  • set listsize count :设置一次显示源代码的函数
  • show listsize:查看当前listsize的设置

设置断点

简单断点-当前文件

break 设置断点,可以简写为b

  • b 10 意思是在源程序的第10行设置断点
  • b func 在func函数入口处设置断点

多文件设置断点–其他文件

  • b filename:linenum 在源文件为filename的linenum行设置断点
  • b filename:function 在源文件filename的function函数的入口处设置断点

查询所有断点

info b == info break == i b

条件断点

为断点设置一个条件,使用关键字if

b xxx.c:n if intValue ==5
如果intValue的值等于5,在xxx.c文件第n行中设置断点

维护断点

delete [range…]

删除指定的断点

  • delete 删除所有的断点
  • delete num 删除断点为num的断点
  • delete num1 num3 删除不连续的断点 num1 num3
  • delete n-m 删除连续的断点,删除 n-m的断点

disable[range…]也可以简写为dis [range…]

指定断点无效,不会删除断点

enable[range…]也可以简写为ena[range…]

指定断点有效,对应解开disable设置的无效断点

调试代码

  • run 运行程序,可简写为r
  • next 单步跟踪,函数调用当做一条简单语句执行,可简写为n
  • step 单步跟踪,函数调用进入被调用函数体内,可简写为s
  • finish 退出进入的函数,如果出不去,可能是函数体中的循环有断点,可以将其删除或设置为无效
  • untile 在一个循环体内单步跟踪,这个命令可以运行程序,直到退出循环体,可简写为u
  • continue 继续运行程序,可简写为c(如果有断点,则调到下一个断点处)

查看变量的值

查看运行时变量的值

print 打印变量、字符串、表达式等的值,可简写为p

p count -----打印count的值
p &count ----打印count的地址

自动显示变量的值

可以设置一些自动显示的变量,当程序停住是,或在单步追踪时,这些变量会自动显示
相关的GDB命令是display

  • display 变量名 设置自动显示
  • info display --查看display设置的自动显示的信息
  • undisplay num (info display时显示的编号)删除自动显示
  • delete display dnums —删除自动显示,dums意味着自动显示的编号,如果要同时删除,用空格分隔,如果删除连续的,可以用-
  • disable display dnums 设置dnums无效
  • enable display dnums 设置dnums有效,与display相反

查看修改变量的值

ptype xxx —查看变量名为xxx的类型
p xxx ----打印变量名为xxx的值

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/93069.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java计算机毕业设计基于安卓Android的教学考勤系统APP

项目介绍 首先,论文一开始便是清楚的论述了系统的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了系统的需求基础上需要进一步地设计系统,主要包罗软件架构模式、整体功能模块、数据库设…

4个表格1个工具,解决客户的分类及管理

1897年&#xff0c;意大利经济学者帕累托发现&#xff1a;“社会上20%的人占有80%的社会财富”。 后来这一法则被发现可以适用到很多领域&#xff0c;包括客户管理。具体解释为“一家企业80%的收益来源于20%的客户”&#xff0c;即20%客户创造了企业80%的收益。 由于20%的客户…

分布式事务处理方案大 PK

[toc] 说好了写 TienChin 项目的&#xff0c;最近这个分布式事务算是一个支线任务吧&#xff0c;今天是再来一个短篇和小伙伴们总结一下分布式事务。 首先先说一个大原则&#xff1a;分布式事务能不用就不要用&#xff0c;毕竟这个用起来还是有一些麻烦的。当然&#xff0c;不…

B/S端界面控件DevExtreme内置的图标库介绍

DevExtreme拥有高性能的HTML5 / JavaScript小部件集合&#xff0c;使您可以利用现代Web开发堆栈&#xff08;包括React&#xff0c;Angular&#xff0c;ASP.NET Core&#xff0c;jQuery&#xff0c;Knockout等&#xff09;构建交互式的Web应用程序&#xff0c;该套件附带功能齐…

闯关

我回来啦&#xff01;停更的几个月&#xff0c;我生了个娃。6.7斤的小虎妞&#xff0c;健健康康、白白胖胖。她现在已经五个多月了&#xff0c;能抬头、会翻身、会咯咯咯地笑、能拿住小玩具、还能摘我的眼镜……过程挺曲折的。不夸张地说&#xff0c;鬼门关溜达了一圈。好在&am…

邀请函小程序开发,减少设计制作局限性

随着社交平台和互联网技术的发展&#xff0c;很多产品的类型都在不断地发生着改变&#xff0c;就连邀请产品现在都出现了电子版的邀请函&#xff0c;颠覆了我们对于传统纸质邀请函的认知。无论是在日常生活学习还是工作中我们都会用到邀请函&#xff0c;而现在越来越多的人倾向…

Android逆向中常用工具和命令

Android逆向中常用工具和命令 Wifi ADB Google Store wifi ADB 当没有数据线时&#xff0c;可以开启wifiADB adb connect 192.168.0.101:5555开始食用 android 运行shell命令 https://github.com/termux/termux-app/releases ADB shell 截图 vim ~/.bash_profile curre…

CAD怎么添加打印机设备?CAD打印机添加步骤

CAD打印时未在系统中找到合适的打印机该怎么办呢&#xff1f;CAD怎么添加打印机设备&#xff1f;本文小编就以浩辰CAD软件为例来给大家分享一下CAD添加打印机设备的详细操作步骤吧&#xff01; CAD添加打印机设备步骤&#xff1a; 首先在浩辰CAD中打开图纸文件&#xff0c;然后…

Speckle+IFC.js:开源BIM

2021年12 月底&#xff0c;我有机会参加了一个关于两个开源工具的网络研讨会&#xff1a;Speckle 和 IFC.js。 该网络研讨会是由一个名为 Agile BIM 的社区组织的&#xff0c;我对此也一无所知。 然而&#xff0c;我所知道的事实是开源软件开发在任何领域的重要性&#xff0c;开…

C#基于ASP.NET的社区人口管理系统

论文阐述了社区人口信息管理系统的设计与实现&#xff0c;并对该系统的需求分析及系统需要实现的设计方法作了介绍。该系统的基本功能包括用户登录&#xff0c;管理员信息管理&#xff0c;常住人口管理&#xff0c;迁出人口信息管理&#xff0c;迁入人口信息管理&#xff0c;查…

Docker安装RabbitMq延迟队列插件

// todo 文章目录一&#xff1a;下载延迟队列插件1. 地址2. 把刚刚下载的插件拖拽至虚拟机中二&#xff1a; 进入容器执行延迟队列插件1. 延迟插件拷贝到容器内部2. 进入容器&#xff0c;让插件生效3. 再次查看交换机类型一&#xff1a;下载延迟队列插件 1. 地址 &#xff1a…

20221216英语学习

今日新词&#xff1a; duplicate v.复制; 被复制; 复写; 复印; 重复; 使加倍; 使成双 September n.九月 scandal n.丑事&#xff0c;丑闻&#xff0c;丑行 considerate adj.考虑周到的&#xff0c;体贴的&#xff0c;体谅的 report n.报告, 报道, 汇报, 调查报告 across …

前端实现分页打印(一)

实现页面为结算单&#xff0c;也页面由固定头部&#xff0c;订单信息&#xff0c;产品列表&#xff0c;金额汇总&#xff0c;订单明细 其中产品列表需要动态计算分压&#xff0c;订单明细由于存在多个子单&#xff0c;订单收费项目可配置化&#xff0c;导致也存在多个分页需要处…

Apereo Cas在项目中接入

1.介绍 Apereo CAS的一个功能就是单点登录&#xff0c;统一的登录登出接口与页面&#xff0c;让系统中的模块只需要关注在业务点&#xff0c;而把安全认证的功能交给统一认证来做。所以客户端的集成主要是单点登录的集成&#xff0c;客户端指定需要做安全认证的页面&#xff0…

8年软件测试工程师感悟—我亲身经历的2022年软件质量工作

这两天和朋友谈到软件测试的发展&#xff0c;其实软件测试已经在不知不觉中发生了非常大的改变&#xff0c;前几年的软件测试行业还是一个风口&#xff0c;随着不断地转行人员以及毕业的大学生疯狂地涌入软件测试行业&#xff0c;目前软件测试行业“缺口”已经基本饱和。当然&a…

PyTorch深度学习框架学习记录(2)--MNIST手写数字识别(续)

文章目录前言MNIST手写数字识别数据的准备工作数据的处理主干网络的定义损失函数的使用&#xff08;修改&#xff09;训练和预测运行前言 这个是我在学习中的其中一种方式实现MNIST手写的识别&#xff0c;思路我觉得比较清晰&#xff0c;后面会把另外的方法代码整理发布。 MN…

是否有 API 可供云对接?

涂鸦提供了两种维度供开发者拉取&#xff1a;应用维度、产品维度。 应用维度&#xff1a;设备绑定的用户属于开发者在涂鸦云应用中的用户&#xff0c;开发者间接拥有权限操作属于自己应用用户的设备&#xff1b; 产品维度&#xff1a;设备所属产品属于开发者在涂鸦云产品中的设…

2022年总结:道阻且长,行则将至

前言 今年是第四个年头写总结了&#xff0c;直到这个时候&#xff0c;我仍未想出今年的标题是什么。 2019年总结&#xff0c;平凡的我仍在平凡的生活 2020年总结&#xff0c;所有努力只为一份期待 2021年总结&#xff1a;前路有光&#xff0c;初心莫忘 如果非得用一句话来…

(Java)SpringMVC学习笔记(二)

前言 继续学习SpringMVC视频教程&#xff0c;争取今明后三天把设定的目标完成 SpringMVC 框架搭建 这一步花了我一上午时间&#xff0c;报了个404错误&#xff0c;没办法&#xff0c;只能从头开始创建项目&#xff08;心态差点整爆炸&#xff0c;第一次是自认不懂&#xff0…

格力博通过创业板注册:上半年营收32亿 拟募资34.56亿

雷递网 雷建平 12月15日格力博&#xff08;江苏&#xff09;股份有限公司&#xff08;简称&#xff1a;“格力博”&#xff09;日前通过注册&#xff0c;准备在深交所创业板上市。格力博计划募资34.56亿元&#xff0c;其中&#xff0c;11.69亿元用于年产500万件新能源园林机械智…