LinuxC/C++开发工具——make/makefile和gdb

news2024/11/17 9:40:06

linux开发工具

  • 前言
  • Linux项目自动化构建工具(make/makefile)
    • makefile文件的组成
    • 如何使用make
      • .PHONY关键字
    • 项目清理
  • gdb调试器
    • 背景
    • 使用
      • list(l)调试命令
      • break(b):设置断点
      • info break: 查看断点信息
      • run (r) : 运行程序,到第一个断点中止
      • 单条执行与单步执行
      • 各种关于运行控制的命令
      • 关于查看变量信息的命令
      • 对断点的各种操作
      • quit(q):退出gdb
  • 总结

前言

想要在linux系统中进行开发,我们用vim编写代码,用gcc,g++来编译代码,但是除了这两个东西还不够,代码调试工具和自动化构建工具也尤为重要,所以本篇博客的目的就是为了带大家了解这两样东西.

Linux项目自动化构建工具——make/makefile
Liunx调试器——gdb

Linux项目自动化构建工具(make/makefile)

  • 俗话说,会不会写nakefile,从侧面说明了一个人是否具备完成大型工程的能力
  • 一个工程的源文件有很多,按照器类型,功能,模块放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作。
  • makefile带来的好处就是——“自动化编译”,一旦写好makefile文件,只需要一个make命令,整个工程弯曲按自动编译,极大的提高了开发的效率。

这里需要注意的是,make是一条命令,makefile是一个文件(需要我们自己编写的),两个搭配使用才完成了项目自动化构建。

那么,到底该如何使用这个工具呢,接下来我们就用一个最简单的例子来讲解。

假设有一个源文件test.c,我们想用gcc编译生成一个文件名为test的可执行程序,我们想使用make,首先需要在当前文件夹下创建一个名为makefile,或者Makefile、GNUmakefile(三选一)的文件,然后编写makefile文件。

makefile文件的组成

那么如何编写makefile文件呢?我们首先要知道,makefile文件内由两个东西构成,分别是依赖关系依赖方法

看下面一个makefile文件:
在这里插入图片描述
上面标识的就是依赖关系,上面的意思是mycode文件时根据mycode.c文件生成的,
而下面的编译指令就是依赖方法,为方便书写,依赖方法在makefile文件内也可以按下面的方式书写:
在这里插入图片描述
再执行make指令时,编译器会自动用:左边的名字替换$@ , 用 :右边的文件名替换 $^,关于下面的.PHONY关键字,我们稍后再进行解释。

如何使用make

当编写完makefile文件后,我们就可以使用make了,直接输入make指令,编译器就会直接执行第一个具有依赖关系的依赖方法,也就是说,上面的例子直接输入make就会执行mycode可执行文件的依赖方法,如下:
在这里插入图片描述
make的原理如下:

  1. make会在当前目录下找名字叫“Makefile”或“makefile”的文件。
  2. 如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“mycode”这个文件, 并把这个文件作为最终的目标文件。
  1. 如果mycode文件不存在,或是mycode所依赖的后面的mycode.c文件的文件修改时间要比mycode这个文件新(可 以用 touch 测试),那么,他就会执行后面所定义的命令来生成mycode这个文件。

要理解这一点,我们需要先了解文件的acm时间属性,

  • a(access):最新文件访问时间
  • c(change):最新文件属性修改时间
  • m(modify):最新文件内容修改时间
    那么,为什么要知道这个时间呢?首先我们可以先测试一下当我们需要生成的文件已经存在的情况下再进行make会发生什么情况。
    在这里插入图片描述
    可以看到,这里make不会产生作用,并且提示当前文件已经是最新版,那么为什么会提示呢?原因就是make在执行时会先检查目标文件和依赖文件的修改时间,如果目标文件的修改时间更新,那么make就不会执行,我们可以用stat指令查看两个文件的modify时间。
    在这里插入图片描述
    为了验证这个原理,我们可以用touch指令修改mycode.c的文件最新修改时间,然后再make看看能否执行。
    在这里插入图片描述
    可以看到,在更新了源文件mycode.c的modify时间后,make又可以成功执行了,从而证明了这一点。

那么,如果想要忽略这个时间的新旧问题强制执行,有没有办法呢?

.PHONY关键字

当然是有的,那就是**.PHONY伪目标关键字,加上.PHONY关键字后,make在执行时就会忽略文件的修旧问题。
在这里插入图片描述
在这里插入图片描述
可以看到,在加入了
.PHONY**关键字后,多次执行make就不会提示了,但是需要注意的是,对于项目来说一般还是需要关注一下时间问题的,所以不会加上该关键字。

  1. 如果一个目标文件所依赖的文件不存在,那么make会在当前文件中找目标为该文件的依赖性,如果 找到则再根据那一个规则生成文件。(这有点像一个堆栈的过程)
  2. 这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文 件。
  3. 在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错, 而对于所定义的命令的错误,或是编译不成功,make根本不理。
  4. make只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在,那么对不起, 我就不工作啦

项目清理

工程项目是需要清理的。

  • 像clean这种,没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动执行, 不过,我们可以显示要make执行。即命令——“make clean”,以此来清除所有的目标文件,以便重编 译。
  • 但是一般我们这种clean的目标文件,我们将它设置为伪目标,用 .PHONY 修饰,伪目标的特性是,总是被 执行的。

以上就是关于make/makefile的自动化构建工具的简单讲解。


那么,知道了如何写工程之后,我们最后就只需要知道如何调试了,接下来就来讲解一下linux下如何调试c/c++程序。

gdb调试器

现在,对于在linux下进行开发,我们只剩下调试工具还没有学习了,接下来,博主就带大家简单的讲解linux中gdb的使用。

背景

在学习gdb之前,我们首先要知道一些程序发布方式方面的背景知识。

  • 程序发布方式有两种,debug模式和release模式
  • linux gcc/g++出来的二进制程序,默认是release模式
  • 要开始gdb调试,必须使用debug模式,在源代码生成二进制程序的时候,要加上-g选项。

使用

接下来,我们就通过刚才的mycode文件来演示各种常见gdb的操作
这是我们编写的mycode.c文件内容:
在这里插入图片描述
生成可执行程序之后,要进行调试,我们只需要输入指令 gdb mycode就可以进入调试模式:

在这里插入图片描述
当我们看见done时,就可以进行调试操作了。

这里首先现说一下,gdb是可以记录上一条的指令的,所以如果我们想进行相同的操作,只需要直接回车即可。接下来讲解各种操作。

list(l)调试命令

  • list/l 行号 :显示源代码,接着上次的位置往下列,每次列10行。
  • list/l 函数名:列出某个函数的源代码
    在这里插入图片描述
    如果我们想查看所有代码,可以先输入list/l 0,然后不断回车即可。
    在这里插入图片描述

break(b):设置断点

  • b 行号 : 在某一行设置断点
  • b 函数名:在某一个函数开头设置断点
    在这里插入图片描述

info break: 查看断点信息

在这里插入图片描述

run (r) : 运行程序,到第一个断点中止

在这里插入图片描述

单条执行与单步执行

  • next(n): 单步执行,不进入函数调用
  • step(s): 单条执行,会进入函数调用

在这里插入图片描述

各种关于运行控制的命令

  • finish :执行到当前函数返回,然后等待命令
  • until 行号:跳至该行
  • continue(c):继续运行直到下一个断点

关于查看变量信息的命令

  • p 变量 : 打印变量的值
  • set var 变量: 修改变量的值
  • display 变量: 追踪查看一个变量,每次停下来显示值
  • undisplay 变量编号:取消对该变量的追踪

注意这里undisplay输入的是变量的编号,而不是变量名

  • breaktrace(bt):查看当前各级调用函数及参数
  • info(i) locals: 查看当前栈帧局部变量的值
    在这里插入图片描述

对断点的各种操作

  • delete breakpoints: 删除所有断点
  • delete breakpoints n:删除序号为n的断点

undisplay相同,这里输入的是编号不是行号

  • disable breakpoints(b):禁用所有断点
  • disable b n:禁用编号为n的断点
  • enable b n:启用编号为n的断点

quit(q):退出gdb


总结

在这篇博客中,带领大家认识了linux下开发所需的自动化构建工具make以及调试工具gdb,但是只是带领大家简单了解,如果想要继续深入,还需要大家多多练习使用,并且查阅更多相关资料哦!

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

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

相关文章

[STL] vector 模拟实现详解

目录 一,准备工作 二,push_back 1, 关于引用 2. 参数const 的修饰 补充 三,迭代器实现 四,Pop_back 五,insert 1. 补充——迭代器失效 六, erase 七,构造函数 1. 迭代…

合并当天Log

1.原因, 我们程序运行Log很多时,如果因为要写Log话费很多时间,这时我们可以把log保存按照更短的时间保存,比如一分钟一个Log,一个小时一个log,。。。。但我们查看Log时很麻烦,需要把分散的Log合并起来的工…

移动端深度学习部署:TFlite

1.TFlite介绍 (1)TFlite概念 tflite是谷歌自己的一个轻量级推理库。主要用于移动端。 tflite使用的思路主要是从预训练的模型转换为tflite模型文件,拿到移动端部署。 tflite的源模型可以来自tensorflow的saved model或者frozen model,也可…

ylb-定时任务task

总览: 在api模块service包,创建IncomeService类:(收益计划 和 收益返还) package com.bjpowernode.api.service;public interface IncomeService {/*收益计划*/void generateIncomePlan();/*收益返还*/void generate…

基于mysql+java+springboot的福州大学生就业求职系统(含源码+系统演示视频)

1、系统演示视频:基于JavaMySQLspringboot的福州大学生就业求职系统演示视频 2、系统源码:系统源码链接 文章目录 一、需求分析1、公司招聘2、简历管理3、交流咨询 二、福州大学就业求职服务平台简介1.福州大学就业求职服务平台主要功能1.1.个人求职功能…

小黑子—JavaWeb:第一章 - JDBC

JavaWeb入门1.0 1. javaweb介绍2. 数据库设计2.1 约束2.2 表关系2.3 多表查询2.3.1 内连接(连接查询)2.3.2 外连接(连接查询)2.3.3 子查询 2.4 事务 3. JDBC3.1 JDBC 快速入门 4 JDBC API详解4.1 DriverManager4.2 Conncetion4.3 …

13_Linux无设备树Platform设备驱动

目录 Linux驱动的分离与分层 驱动的分隔与分离 驱动的分层 platform平台驱动模型简介 platform总线 platform驱动 platform设备 platform设备程序编写 platform驱动程序编写 测试APP编写 运行测试 Linux驱动的分离与分层 像I2C、SPI、LCD 等这些复杂外设的驱动就不…

吴恩达ML2022-用于手写数字识别的神经网络

1 用到的包 导入在这个分配过程中需要的所有包。 Numpy 是使用 Python 进行科学计算的基本软件包。Matplotlib 是在 Python 中绘制图形的流行库。tensorflow是一种流行的机器学习平台。 import numpy as np import tensorflow as tf from tensorflow.keras.models import Se…

Java对象导论

对象具有状态、行为和标识。每个对象都可以拥有内部数据(它们给出了该对象的状态)和方法(它们产生的行为),并且每个对象在内存中都有一个唯一的地址(标识)。 抽象过程就是在问题空间元素和解空…

Macbook下提升开发效率的几个小工具

最近倒腾mac笔记本,记录下一些高效率的工具吧。 首先就是alfred,内置可以自定义各种快捷命令查找,配合Dash来快速查找C系统API,其实Dash中包含了各种编程所需API文档,值得下载。 以前我都是直接查看cppreference.c…

【分享】Redis的五种基本数据类型和应用场景

前言: Redis支持五种基本数据类型: String(字符串类型):可以是普通字符串,也可以是整数或浮点数值。可以设置过期时间;可以对字符串进行append、get、set、incr、decr等操作。Hash&#xff08…

【C++】位图和布隆过滤器

文章目录 位图概念难点代码 布隆过滤器概念插入查找删除优缺点代码 位图 概念 所谓位图,就是用每一个比特位位来存放某种状态,适用于海量数据,数据无重复的场景。通常是用来判断某个数据存不存在的。 给40亿个不重复的无符号整数&#xff…

buu_Misc总结2

目录 百里挑一 exiftool: [SUCTF2018]followme grep工具使用: [安洵杯 2019]Attack mimikatz工具使用: 百里挑一 打开文件是流量包,发现里面有很多图片 导出http 另存一个文件夹,里面很多图片,啥也看不出来 &…

医用影像技术

1.X光和CT原理 X光和CT(计算机断层扫描)都是医学成像技术,用于诊断和治疗。它们的原理如下: X光原理: X光是一种电磁辐射,与可见光类似,但具有更高的能量。当X光通过人体或物体时,…

创作一周年纪念日【道阻且长,行则将至】

✨个人主页: 北 海 🎉所属专栏: 技术之外的往事 🎃所处时段: 大学生涯[1/2] 文章目录 一、起点一切皆有定数 二、成果尽心、尽力 三、相遇孤举者难起,众行者易趋 四、未来长风破浪会有时,直挂云…

[MySQL]MySQL表中数据的增删查改(CRUD)

[MySQL]MySQL表中数据的增删查改(CRUD) 文章目录 [MySQL]MySQL表中数据的增删查改(CRUD)1. 新增数据1.1 单列插入1.2 多列插入1.3 插入否则更新1.4 替换 2. 基本查询数据2.1 全列查询2.2 指定列查询2.3 查询字段为表达式2.4 为查询结果指定别名2.5 结果去重2.6 where子句2.7 or…

修复漏洞(二)离线升级Tomcat版本

前言 生产环境无法联网,只能通过下载离线版本更新Tomcat到小版本最新注意Tomcat10和11与jdk1.8都不兼容,只能更新到小版本的最新前提是按照我这种方法配置Tomcat开机自启的https://blog.csdn.net/qq_44648936/article/details/130022136 步骤 备份整个…

IAR编译报错:Error[Pe065: expected a “.“ and Error[Pe007]:unrecognized token

IAR报错 Error[Pe065: expected a “.” and Error[Pe007]:unrecognized token 使用IAR编译报如下错误: 找到软件报错的地方,从肉眼看,并没有错误的地方,如下图所示: 这时肯定是丈二和尚摸不着头脑,这里…

VMware种ubuntu22.04挂载ax88179网卡不显示的问题

网上找了很多解决办法,都说是驱动的问题,其实不是。ubuntu22自带无bug的ax88179的驱动。 其实是Vmware的问题,在虚拟机设置种添加一个usb控制器,然后这样设置就好了。

HCIP第一课实验小练习

目录 题目:​编辑 第一步:地址规划(子网划分) 第二步:设计拓扑并规划地址配置 第三步:VLAN规划配置 LW1 LW2 第四步:网关配置 第五步:及静态路由配置 第六步防止成环 题目&…