Linux工具篇:gdb(调试工具)+ makefile(自动化构建工具)

目录

前言:

Linux调试器-gdb使用:

Linux项目自动化构建工具-make/Makefile:

问题:

为什么makefile对最新的可执行程序,默认不想不想重新形成呢?

make是如何知道到我的程序需要被编译的呢?

能不能简化一下makefile?

总结:


前言:

        在学习Linux之前,确切的说是在认识和使用vim之前,我们学习C语言甚至是C++都是在VS2022等Windows的IDE上进行编写代码的,我们之前也讲过,VS2022有两个版本,一个是Debug版本,还有一个是Release版本。Debug版本是给我们来进行调试编译的,那么在Linux下也存在我们的调试工具——gdb。makefile则是一个新的概念,它是Linux项目自动化构建工具。

Linux调试器-gdb使用:

        编译器在区别Debug和Release版本的方式,就是编译器在对Debug版本形成可执行程序时,会给Debug版本的可执行程序增添调试信息。 我们在平常输入指令gcc "XXX"的时候默认是形成Release的可执行程序,其实我们只需要在最后加上 -g选项就是Debug版本了。

  • list/l 行号:显示binFile源代码,接着上次的位置往下列,每次列10行。
  • list/l 函数名:列出某个函数的源代码。
  • r或run:运行程序。
  • n 或 next:单条执行。
  • s或step:进入函数调用
  • break(b) 行号:在某一行设置断点
  • break 函数名:在某个函数开头设置断点
  • info break :查看断点信息。
  • finish:执行到当前函数返回,然后挺下来等待命令
  • print(p):打印表达式的值,通过表达式可以修改变量的值或者调用函数
  • p 变量:打印变量值。
  • set var:修改变量的值
  • continue(或c):从当前位置开始连续而非单步执行程序
  • run(或r):从开始连续而非单步执行程序
  • delete breakpoints:删除所有断点
  • delete breakpoints n:删除序号为n的断点
  • disable breakpoints:禁用断点
  • enable breakpoints:启用断点
  • info(或i) breakpoints:参看当前设置了哪些断点
  • display 变量名:跟踪查看一个变量,每次停下来都显示它的值
  • undisplay:取消对先前设置的那些变量的跟踪
  • until X行号:跳至X行
  • breaktrace(或bt):查看各级函数调用及参数
  • info(i) locals:查看当前栈帧局部变量的值
  • quit:退出gdb
     

我们在调试的时候,一定要先设置断点再run起来,输入r。

Linux项目自动化构建工具-make/Makefile:

  • 会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力
  • 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作
  • makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
  • make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。
  • make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构
mytest.exe:test.cgcc test.c -o test.exe
.PHONY:clean
clean:rm -f mytest

        以上就是最简单基础的makefile里的代码,这里要特别注意,gcc前面一定要加tab,剩下的也同理,一定一定要加tab,接下来就来创建test.c来实战编写一下。

 

 

         接下来输入make指令:

make就自动调用makefile里面的指令:gcc test.c -o test.exe

 

要想清理test.exe ,输入make clean即可。

make会根据makefile的内容,完成编译/清理工作。

一般会先默认形成第一个目标文件,先写可执行程序。

.PHONY : XXX

表示XXX总要被执行,如下图验证:

 

因为我已经存在了一个test.exe文件,而test.exe作为目标文件 且 没有.PHONY修饰,如果继续make则不会运行。再看看我们的 make clean:

不一样的地方就在于make clean可以一直运行,这是因为在make clean前面加了.PHONY进行修饰。

其实普通的make也可以用.PHONY进行修饰。

这次我把.PHONY提前了。 

 

 很明显,这次就没之前的英文:"test.exe is up to data"

问题:

为什么makefile对最新的可执行程序,默认不想不想重新形成呢?

        最主要的目的——为了提高编译效率,如果你对gcc或者g++之前添加了.PHONY,那么十几行的代码或者一个.c文件那还好,万一你又200000个.c文件需要被编译呢?这样效率就很低下了。

make是如何知道到我的程序需要被编译的呢?

        我先总结一句话:“代码编写完的时间和编译的时间绝对不一样!”

      

        如图,肯定是先编写完代码,才会对代码进行编译。所以不加.PHONY的make就是根据查找时间线之前是否存在编译好的代码,如果存在就不再进行编译了。.PHONY就是让系统别按照时间线来查找,一言不合就是“干”!

能不能简化一下makefile?

        当然是可以的,makefile/make会自动根据文件中的依赖关系,进行自动推导,帮助我们执行所有的相关的依赖方法。但必须保证你最终要到的目标文件放在最前面!

@:表示目标文件

^:表示后面的文件

        当然makefile中也支持定义变量:

 

当然如果你不想在执行make后,让屏幕出现执行语句,你可以在gcc前面加个@

总结:

1. make会在当前目录下找名字叫“Makefile”或“makefile”的文件。
2. 如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“hello”这个文件,并把这个文件作为最终的目标文件。
3. 如果test.exe文件不存在,或是test.exe所依赖的后面的test.c文件的文件修改时间要比test.exe这个文件新(可以用 touch 测试),那么,他就会执行后面所定义的命令来生成test.exe这个文件。
4. 如果test.exe所依赖的test.c文件不存在,那么make会在当前文件中找目标为test.exe文件的依赖性,如果找到则再根据那一个规则生成test.c文件。(这有点像一个堆栈的过程)
5. 当然,你的C文件和H文件是存在的啦,于是make会生成 test.exe 文件,然后再用 test.c 文件声明make的终极任务,也就是执行文件test.exe了。
6. 这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。
7. 在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make根本不理。
8. make只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在,那么对不起,我就不工作啦。

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

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

相关文章

监控系统怎样做?

监控类型自底向上分为资源监控、服务监控和业务监控。希望打造公司级的监控系统最好的时机是系统规划时,如果把监控设计往后放,将会面临一个巨大的难题:推行和现有不兼容的规范。 三种监控类型 资源监控 这个相对简单,随着k8s的兴…

【个人笔记】685. 冗余连接 II 的解释(并查集)

一棵树有n个点和n条边,返回一条能删除的边,使得剩下的图是有 n 个节点的有根树。 解释: 注意不冗余的有根树的特性!**根节点入度为0,其余结点只有一个入度!**所以冗余的两种情况如下: &#xff…

芯片基础 | Verilog仿真平台及数字逻辑仿真(上)

被测试器件DUT是一个二选一多路器,测试程序(testbench)提供测试激励及验证机制 Testbench使用行为级描述,DUT采用门级描述 下面将给出Testbench的描述、DUT的描述及如何进行混合仿真(行为级+门级) DUT (Device Under Test) module mux2_1(//Port declarations 端口声明outp…

Linux常见配置

linux 常见配置 一、配置固定IP, 主机名映射二、配置环境变量三、vim配置四、ssh配置 一、配置固定IP, 主机名映射 1、修改主机名 hostnamectl set-hostname xxx2、Centos配置固定IP 使用vim编辑/etc/sysconfig/network-scripts/ifcfg-ens33文件,填入下图信息 …

AI伦理之舟:航行于隐私、公正与真实的海域

🌈所属专栏:【其它】✨作者主页: Mr.Zwq✔️个人简介:一个正在努力学技术的Python领域创作者,擅长爬虫,逆向,全栈方向,专注基础和实战分享,欢迎咨询! 您的点…

数据编织 VS 数据仓库 VS 数据湖

目录 1. 什么是数据编织?2. 数据编织的工作原理3. 代码示例4. 数据编织的优势5. 应用场景6. 数据编织 vs 数据仓库6.1 数据存储方式6.2 数据更新和实时性6.3 灵活性和可扩展性6.4 查询性能6.5 数据治理和一致性6.6 适用场景6.7 代码示例比较 7. 数据编织 vs 数据湖7.1 数据存储…

Linux-CentOS7忘记密码找回步骤

虚拟机版本 一、进入开机页面,先按上下(↑↓)键,以免系统自动启动。 二、按“e”键进入编辑页面,找到如下图位置,输入:init/bin/sh 按CTRLX 进入单用户模式。 三、 输入 mount -o remount,rw / 然后按 ent…

ctfshow-web入门-php特性(web127-web131)

目录 1、web127 2、web128 3、web129 4、web130 5、web131 1、web127 代码审计: $ctf_show md5($flag); 将 $flag 变量进行 MD5 哈希运算,并将结果赋值给 $ctf_show。 $url $_SERVER[QUERY_STRING]; 获取当前请求的查询字符串(que…

js继承之构造函数继承

最近在看js红宝书,学到了继承这一章节,看到了下图这段代码根据自己理解不明白为什么两次实例的colors值不一样 又是自己画图又是查找资料看别人如何理解的,今天才按自己的理解搞明白为啥。可能我的理解也是有偏差错误的,希望佬可以…

爬虫(一)——爬取快手无水印视频

前言 最近对爬虫比较感兴趣,于是浅浅学习了一些关于爬虫的知识。爬虫可以实现很多功能,非常有意思,在这里也分享给大家。由于爬虫能实现的功能太多,而且具体的实现方式也有所不同,所以这里开辟了一个新的系列——爬虫…

“卓越级”!火山引擎边缘云持续推动行业标准与生态建设,获多项权威认可

7月18日,由中国通信标准化协会主办的第四届云边协同大会暨首届分布式算力论坛在北京成功召开,大会聚焦算力多元泛在化发展趋势及“人工智能”前沿探索,围绕行业技术标准、行业前沿实践、行业发展规划等主题方向发布了诸多成果、标杆、计划等。…

ts报错|| Warning: Failed prop type:xxx but its value is `undefined`

场景 分析 可选链(?.) 可选链操作符允许你安全地访问对象的嵌套属性,即使其中间的一个属性可能不存在也不会抛出错误。如果globalAlertDetail是一个对象并且它有isShow属性,那么globalAlertDetail?.isShow会返回该属性的值。如果globalAlertDetail不…

Python机器学习、深度学习技术提升气象、海洋、水文领域实践技术

Python是功能强大、免费、开源,实现面向对象的编程语言,能够在不同操作系统和平台使用,简洁的语法和解释性语言使其成为理想的脚本语言。除了标准库,还有丰富的第三方库,Python在数据处理、科学计算、数学建模、数据挖…

如何使用AI辅助开发

自从踏上AI辅助开发这条不归路,就回不了头,只能勇往直前!就算是简单的智能提示、补充代码、自动多语言补全等功能,就已经让你离不开它,更何况强大的代码生成成功。如果还没有开始使用AI辅助开发,那么赶快为…

C++复习的长文指南

C复习的长文指南 一、入门语法知识1.预备1.1 main函数1.2 注释1.3 变量1.3 常量1.4 关键字1.5 标识符明明规则 2. 数据类型2.1 整型2.1.1 sizeof关键字 2.2 实型(浮点型)2.3 字符型2.4 转义字符2.5 字符串型2.6 布尔类型bool2.7 数据的输入 3. 运算符3.1…

windows 11 PC查询连接过的wlan密码

1:管理员打开cmd 2:输入netsh wlan show profiles 3:netsh wlan show profiles Shw2024-5G keyclear 密码关键内容:12345678

函数返回右值的一点学习研究

https://zhuanlan.zhihu.com/p/511371573?utm_mediumsocial&utm_oi939219201949429760 下面情况下不会调用: DPoint3d fun1() {return DPoint3d{1,2,3}; // 默认构造 }int main() {DPoint3d&& a fun1();a.y 20;int i 0;i; } 下面情况下&#xff0c…

Stable Diffusion:质量高画风清新细节丰富的二次元大模型二次元插图

今天和大家分享一个基于Pony模型训练的二次元模型:二次元插图。关于该模型有4个不同的分支版本。 1.5版本:loar模型,推荐底模型niji-动漫二次元4.5。 xl版本:SDXL模型版本 mix版本:光影减弱,减少SDXL版本…

[职场] MARKETINGSPECIALIST是什么 #笔记#微信#知识分享

MARKETINGSPECIALIST是什么 MARKETINGSPECIALIST,即市场营销专员,他们需要具备一定的专业知识和技能,以适应快速变化的市场环境。接下来,我们将详细探讨这个职位的工作内容、必备技能以及发展前景。 一、MARKETINGSPECIALIST是什么…

Postfix搭建安装教程:解决配置难题攻略!

Postfix搭建安装教程的详解!如何优化邮件服务器性能? Postfix是一款广泛使用的电子邮件服务器软件,以其高效、可靠和安全性而闻名。许多企业和个人站点都选择Postfix来处理邮件传输任务。AokSend将提供一个详尽的Postfix搭建安装教程。 Pos…