Linux(三) makefile与gdb调试

news/2024/5/10 18:00:13/文章来源:https://blog.csdn.net/qq_46066548/article/details/128316386

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.cgcc -o main main.c fun1.c fun2.c

第二个版本

 main:main.o fun1.o fun2.ogcc -o main main.o fun1.o fun2.omain.o:main.cgcc -c main.c -I./fun1.o:fun1.cgcc -c fun1.cfun2.o:fun2.cgcc -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.luyixian.cn/news_show_236323.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

硬件需知知识 -- 基本元件(电阻)

一、电阻 1.1 贴片电阻 1.1.1 贴片电阻的封装大小是和功率时相关的。 封装大小功率(W)0201120\frac{1}{20}201​0402116\frac{1}{16}161​0603110\frac{1}{10}101​080518\frac{1}{8}81​12060.2518120.5或1201012\frac{1}{2}21​25121或者21.1.2 贴片电阻读数 贴片电阻的读数…

Ac-EEVVAC-pNA,389868-12-6

Ac-EEVVAC-pNA, chromogenic substrate for a continuous spectrophotometric assay of HCV NS3 protease. The sequence EEVVAC is derived from the 5A-5B cleavage junction of the HCV polyprotein. Ac-EEVVAC-pNA, HCV NS3蛋白酶连续分光光度法测定的显色底物。EEVVAC序列…

新冠病毒:KN95(GB2626类型口罩)是否有效阻挡?

点击上方“青年码农”关注回复“源码”可获取各种资料​今天刷新闻&#xff0c;看到很多官方账号发布&#xff0c;只有五种编码口罩能防疫&#xff0c;分别是医用防护口罩&#xff08;GB19083-2010&#xff09;医用外科口罩&#xff08;YY0469-2011&#xff09;一次性使用医用口…

带有匹配滤波器的雷达信号调制和脉冲压缩Matlab仿真

up目录 一、理论基础 二、核心程序 三、测试结果 一、理论基础 匹配滤波器&#xff1a; 匹配滤波器是输出端的信号瞬时功率与噪声平均功率的比值最大的线性滤波器也就是说有最大的信噪比。其滤波器的传递函数形式是信号频谱的共轭。在通信系统中&#xff0c;滤波器是其中重…

微服务框架 SpringCloud微服务架构 多级缓存 47 Lua 语法入门 47.3 条件控制、函数

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 多级缓存 文章目录微服务框架多级缓存47 Lua 语法入门47.3 条件控制、函数47.3.1 函数47.3.2 条件控制47 Lua 语法入门 47.3 条件控制、函数…

【图像融合】DCT域多焦点图像融合【含Matlab源码 1973期】

⛄一、基于DCT变换的图像融合算法简介 在图像融合过程中,最主要的就是如何提取低高频系数以及低高频系数的融合准则。基于DCT变换的图像融合算法原理如图2所示。 图2 DCT融合算法原理 算法步骤如下。 步骤1精确配准待融合的源图像。 步骤2采用分块的方法将参与融合的每幅大小…

【Java版oj】逆波兰表达式求值

目录 一、原题再现 二、问题分析 三、完整代码 一、原题再现 150. 逆波兰表达式求值 有效的算符包括 、-、*、/ 。每个运算对象可以是整数&#xff0c;也可以是另一个逆波兰表达式。 注意 两个整数之间的除法只保留整数部分。 可以保证给定的逆波兰表达式总是有效的。换句话…

1、浮动(float)

提示&#xff1a;我们一般网页上下用标准流&#xff0c;左右用浮动来写 1.1传统网页布局三种方式 网页布局本质——用css来摆放盒子&#xff0c;把盒子摆放到相应位置。css提供了三种传统布局简单方式&#xff0c;说就是盒子如何进行排列顺序&#xff1a; 普通流&#xff08;或…

[附源码]Python计算机毕业设计高校助学金管理系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

Selenium3自动化测试【40】Html测试报告

&#x1f4cc; 博客主页&#xff1a; 程序员二黑 &#x1f4cc; 专注于软件测试领域相关技术实践和思考&#xff0c;持续分享自动化软件测试开发干货知识&#xff01; &#x1f4cc; 公号同名&#xff0c;欢迎加入我的测试交流群&#xff0c;我们一起交流学习&#xff01; 目录…

tkinter: 基本+Button+Layout

简介 简介 Tcl 动态解释型编程语言可独立执行&#xff0c;多嵌入C程序中作为脚本引擎&#xff0c;或者作为使用Tk工具包的接口Tcl库可以创建一个或多个Tcl解释器实例&#xff0c;然后在这些实例上运行C或Tcl命令和脚本每个解释器有一个事件队列&#xff0c;接受事件并处理他们…

分享10个比B站更刺激的网站,千万别轻易点开

作为一个码龄8年程序员&#xff0c;到现在还能保持着浓密的头发和健壮的身体&#xff0c;全靠这10个网站让我健&#xff08;偷&#xff09;康&#xff08;偷&#xff09;生&#xff08;摸&#xff09;活&#xff08;鱼&#xff09;&#xff0c;今天就把我收藏夹里的网站无私分享…

【实时数仓】在Hbase建立维度表、保存维度数据到Hbase、保存业务数据到kafka主题

文章目录一 分流Sink之建立维度表到HBase(Phoenix)1 拼接建表语句&#xff08;1&#xff09;定义配置常量类&#xff08;2&#xff09;引入依赖&#xff08;3&#xff09;hbase-site.xml&#xff08;4&#xff09;在phoenix中执行&#xff08;5&#xff09;增加代码a TableProc…

用Python写一个模拟qq聊天小程序的代码实例

前言 今天小编就为大家分享一篇关于用Python写一个模拟qq聊天小程序的代码实例&#xff0c;小编觉得内容挺不错的&#xff0c;现在分享给大家&#xff0c;具有很好的参考价值&#xff0c;需要的朋友一起跟随小编来看看吧 Python 超简单的聊天程序 客户端: 服务器: 模拟qq聊…

张驰咨询:快速提高流程效率的5个关键精益生产工具

精益&#xff0c;又称“精益制造”或“精益生产”&#xff0c;注重通过消除浪费、消除缺陷&#xff0c;实现客户价值最大化。精益工具是关于理解过程&#xff0c;发现浪费&#xff0c;防止错误和记录你所做的事情。 让我们来看看流程改进中使用的五种精益工具&#xff0c;它们…

对 CSS 工程化的理解

CSS 工程化是为了解决以下问题&#xff1a; 宏观设计&#xff1a;CSS 代码如何组织、如何拆分、模块结构怎样设计&#xff1f;编码优化&#xff1a;怎样写出更好的 CSS&#xff1f;构建&#xff1a;如何处理我的 CSS&#xff0c;才能让它的打包结果最优&#xff1f;可维护性&a…

ReplicaSet和Deployment

ReplicaSet和Deployment 写在前面 语雀原文阅读效果更佳&#xff1a;198 ReplicaSet和Deployment 语雀 《198 ReplicaSet和Deployment》 1、ReplicaSet 假如我们现在有一个 Pod 正在提供线上的服务&#xff0c;我们来想想一下我们可能会遇到的一些场景&#xff1a; 某次运营…

计算机毕业设计django基于python大学生多媒体学习系统

项目介绍 随着计算机多媒体技术的发展和网络的普及。采用当前流行的B/S模式以及3层架构的设计思想通过Python技术来开发此系统的目的是建立一个配合网络环境的大学生多媒体学习系统的平台,这样可以有效地解决数据学习系统混乱的局面。 本文首先介绍了大学生多媒体学习系统的发…

加密与认证技术

加密与认证技术密码技术概述密码算法与密码体制的基本概念加密算法与解密算法秘钥的作用什么是密码密钥长度对称密码体系对称加密的基本概念典型的对称加密算法DES加密算法3DES加密算法非对称密码体系非对称加密基本概念密码技术概述 密码技术是保证网络安全的核心技术之一&am…

Jmeter(十六):jmeter场景的运行架构(本地运行和远程运行)配置远程负载机

jmeter场景的运行架构(本地运行和远程运行) 运行方式&#xff1a; GUI运行&#xff1a;通过图形界面方式运行&#xff0c;该运行方式的可视化界面及监听器动态展示 结果都比较消耗负载机资源&#xff0c;建议大并发时不用&#xff0c;一般进行脚本调试&#xff1b; 命令行运行…