【Linux】项目自动化构建工具-make/Makefile与Linux调试器-gdb使用

news2024/11/25 12:17:43

文章目录

  • Linux项目自动化构建工具-make/Makefile
  • Linux调试器-gdb使用

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

背景

  • 会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力
  • 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的
    规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂
    的功能操作
  • makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编
    译,极大的提高了软件开发的效率。
  • make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命
    令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一
    种在工程方面的编译方法。
  • make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。
    在这里插入图片描述
    再上图当中,myfile与myfile处于依赖关系,它们下面形成可执行文件的代码就是依赖方法。想要将项目自动化构建成功依赖关系和依赖方法是缺一不可的。
    左边的叫做目标文件而右边的叫做依赖列表,依赖列表可以是空也可以是多个文件。
    上图当中形成可执行文件命令是make/make myfile 而删除可执行文件就是make clean
    在这里插入图片描述
    当我们将目标文件myfileclean交换位置,在形成可知执行文件就是make myfile而删除可执行文件就是make/make clean,执行命令是从上至下的,所以第一个目标文件执行命令默认是make
    .PHONY的意思是总是被执行的。 当然每个目标文件的是可以用的,这样就可以保证文件可以重复运行。clean是默认带的,因为删除总是可以被执行的并没有什么麻烦,而myfile就不可以了,因为文件总是被执行的很浪费时间。
    myfile不加.PHONY的时候文件就不能总是被执行,而系统判断文件是否能执行的的依据是什么,就是源文件和可执行文件的时间对比,可以运行的文件,源文件应该比可执行文件的的时间要早。
    在这里插入图片描述
    从上图当中源文件的时间明显要比可执行文件早,所以现在已经是最新状态,当然如果想要不修改文件内容就改变源文件时间,可以使用touch来欺骗maketouch创建文件时,如果该文件没有被创建,就创建该文件,如果已经创建了,就修改源文件的时间到当前。

Linux调试器-gdb使用

背景
在之间我学习过了编辑器,编译器,gdb就是调试器,用来查找写过代码的错误。

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

基本操作
在操作之前需要确认一下我们的gdb是否安装,安装命令:yum install gdb
进入gdb和退出
进入 gdb 文件名 退出 ctrl+d/quit
将源代码展开

  • 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(d):删除所有断点

  • delete breakpoints n:删除序号为n的断点,在删除断点时,并不是使用的行号而是断点的编号

  • disable breakpoints:禁用断点,在禁止断点时,并不是使用的行号而是断点的编号
    在这里插入图片描述

  • enable breakpoints:启用断点,在启动断点时,并不是使用的行号而是断点的编号

  • info(或i) breakpoints:参看当前设置了哪些断点

  • display 变量名:跟踪查看一个变量,每次停下来都显示它的值
    在这里插入图片描述

  • undisplay:取消对先前设置的那些变量的跟踪

  • until X行号:跳至X行,在该函数内,进行跳转并执行

  • breaktrace(或bt):查看各级函数调用及参数

  • info(i) locals:查看当前栈帧局部变量的值

  • quit:退出gdb

在上面的命令例子,是在当前代码中实现的

#include <stdio.h>

int addToTop(int top)
{
    printf("enter addToTop\n");
    int sum = 0;
    for(int i = 1; i <= top; i++)
    {
        sum += i;
    }
    printf("quit addToTop\n");
    return sum;
}

int main()
{
    int top = 100;

    int result = addToTop(top);
    printf("result:%d\n", result);
    return 0;
}
最后:文章有什么不对的地方或者有什么更好的写法欢迎大家在评论区指出

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

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

相关文章

SpringBoot+Vue图书馆管理系统

简介&#xff1a;本项目采用了基本的SpringBootVue设计的图书馆管理系统。详情请看截图。经测试&#xff0c;本项目正常运行。本项目适用于Java毕业设计、课程设计学习参考等用途。 项目描述 项目名称SpringBootVue图书馆管理系统源码作者LHL项目类型Java EE项目 &#xff08;…

【iMessage苹果推推送】将看到一个可扩大选项“AppleDevelopmentPushServices”6.扩展此选项并右键单击“Appledge”>

推荐内容IMESSGAE相关 作者✈️IMEAX推荐内容iMessage苹果推软件 *** 点击即可查看作者要求内容信息作者✈️IMEAX推荐内容1.家庭推内容 *** 点击即可查看作者要求内容信息作者✈️IMEAX推荐内容2.相册推 *** 点击即可查看作者要求内容信息作者✈️IMEAX推荐内容3.日历推 *** …

基于NOSTR协议的“公有制”版本的Twitter,去中心化社交软件Damus用后感,一个极端走向另一个极端

最近&#xff0c;一个幽灵&#xff0c;Web3的幽灵&#xff0c;在网络游荡&#xff0c;它叫Damus&#xff0c;这玩意诠释了什么叫做病毒式营销&#xff0c;滑稽的是&#xff0c;一个Web3产品却在Web2的产品链上疯狂传销&#xff0c;各方大佬纷纷为其背书&#xff0c;到底发生了什…

基于python实现疫情期间微博、B站网民情绪分析

一项目概述&#xff1a;“疫情下的社会心理学”这一课题旨在通过疫情期间大众在自媒体上的新闻评论等信息&#xff0c;凭借一些方法分析出总体的心理变化和情绪走向&#xff0c;并在宏观上把握了总体的心态格局。对于该课题&#xff0c;我们小组首先爬取了哔哩哔哩和微博的大量…

Spring Boot(三):第二种导入依赖方式的实战案例(常用)

文章目录 第二种导入依赖方式的实战案例 一、导入依赖方式1&#xff08;拓展方法&#xff09; 二、使用idea自带springBoot项目初始化插件 第二种导入依赖方式的实战案例 一、导入依赖方式1&#xff08;拓展方法&#xff09; 在公司中可能会出现必须继承某个项目&#xff…

Linux日志分析工具之AWStats

Linux日志分析工具之AWStats &#x1f4d2;博客主页&#xff1a; 微笑的段嘉许博客主页 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐留言&#x1f4dd; &#x1f4cc;本文由微笑的段嘉许原创&#xff01; &#x1f4c6;CSDN首发时间&#xff1a;&#x1f334;2…

力扣sql简单篇练习(十)

力扣sql简单篇练习(十) 1 过去30天的用户活动 || 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 a 示例输入 b 示例输出 1.2 示例sql语句 # 多少天内使用Date_SUB函数,具体用法是Date_SUB(初始日期,interval 变更的天数 day) ,正数找过去负数找未来 # 变更天数多少…

接口测试、接口协议以及常用接口测试工具介绍

目录 一、前言&#xff1a;什么是接口 二、接口协议以及对应的接口测试工具 三、接口测试如何设计测试用例&#xff1f; 四、接口组成&#xff1f; 五、总结 一、前言&#xff1a;什么是接口 1.接口指的是软件提供给外界的一种服务。作用在于使其内部的数据能被外部进行修…

买的香港云服务器怎么用?云服务器使用教程

香港云服务器的优势及好处&#xff0c;使得很多人都愿意使用和推荐&#xff0c;推荐的人多了自然购买的人就多了&#xff0c;其中不乏很大部分新手&#xff0c;购买之后却不知道该怎么使用和管理登录等操作。下面我们聊聊香港云服务器怎么登录使用。 香港云服务器登录管理方法&…

论文浅尝 | 基于无监督标注的漏洞描述文本概念抽取

笔记整理&#xff1a;韩林峄&#xff0c;天津大学博士论文发表期刊&#xff1a;Transactions on Software Engineering and Methodology (TOSEM)动机软件漏洞对推进漏洞分析和安全研究具有巨大的潜力&#xff0c;人们往往使用自然语言来描述软件漏洞的关键特征&#xff0c;并在…

JAVA打印数字二进制编码逻辑说明

在我们学习算法的过程中&#xff0c;我们首先必须要知道的就是数据(尤其是数字)类型在底层保存的方式。因为这样才能使我们的算法变的更加高效。 在JAVA中我们常用的数字类型是int类型&#xff0c;有过基础的同学应该知道int数据类型的长度为32bit。但实际使用时需要注意只有3…

11 |「哈希表」简析

前言 前言&#xff1a;刷「哈希表」高频面试题。 文章目录前言一、简介1、离散化1&#xff09;什么是离散化2&#xff09;离散化存储3&#xff09;离散化映射2、哈希表1&#xff09;什么是哈希表2&#xff09;哈希表存储3&#xff09;哈希函数4&#xff09;哈希冲突二、参考链接…

Python爬取网页Flex渲染的动态内容

我最近使用Python爬取网页内容时遇到Flex渲染的动态页面&#xff0c;比如下图的课程目录标题&#xff0c;此时按鼠标右键&#xff0c;菜单里没有复制链接的选项。 目的&#xff1a;获取各个视频标题、链接。 按F12进入开发者模式分析网页&#xff0c;可见有多个flex标签&#…

通用视觉框架OpenMMLab图像分类与基础视觉模型

文章目录流程传统方法&#xff1a;设计图像特征(1990s~2000s)特征工程的天花板从特征工程到特征学习层次化特征的实现方式AlexNet 的诞生& 深度学习时代的开始图像分类的数学表示AlexNet (2012)Going Deeper (2012~2014)VGG (2014)GoogLeNet (Inception v1, 2014)精度退化问…

ROS2 基础概念 动作

ROS2 基础概念 动作1. Actions2. 动作3. 中止目标4. 动作类型5. 动作请求1. Actions Actions 动作是ROS 2中的通信类型之一&#xff0c;适用于长时间运行的任务 它们由三部分组成&#xff1a;目标、反馈 和 结果&#xff0c;操作基于话题和服务 它们的功能类似于服务&#xff…

【大数据clickhouse】clickhouse 数据一致性保障常用解决方案

一、前言 对于任何一个数据存储的框架来说&#xff0c;确保数据的一致性都是其非常重要的组成部分&#xff0c;不管是过程中的强一致性&#xff0c;还是最终一致性&#xff0c;都是数据一致性的解决方案&#xff0c;本篇来聊聊clickhouse中的数据一致性问题。 二、clickhouse …

JMeter使用BeanShell断言

BeanShell简介BeanShell是使用Java语法的一套脚本语言&#xff0c;在JMeter的多种组件中都有BeanShell的身影&#xff0c;如&#xff1a;定时器&#xff1a;BeanShell Timer前置处理器&#xff1a;BeanShell PreProcessor采样器&#xff1a;BeanShell Sampler后置处理器&#x…

软件的生命周期(软件工程各阶段的工作)

其实软件工程是一个非常大的概念&#xff0c;我们的软件测试也好&#xff0c;软件开发也好&#xff0c;软件运维也好&#xff0c;其实都是属于软件工程的范畴。 今天就讲一讲软件工程和我们软件测试相关的一些内容。 我们今天三个主要的节点&#xff1a; 1.软件的生命周期 至…

QT中级(1)QTableView自定义委托(一)实现QSpinBox、QDoubleSpinBox委托

1 写在前面的话 我们在之前写的《QT(7)-初识委托》文章末尾提到&#xff0c;“使用一个类继承QStyledItemDelegate实现常用的控件委托&#xff0c;在使用时可以直接调用接口&#xff0c;灵活实现各种委托”。我们接下来几篇文章将先详细讲解各个控件的委托&#xff0c;最后整理…

怎么理解输入输出流 - 输入输出流之我解

背景 昨天领导开会&#xff0c;讨论两个接口之间参数问题&#xff0c;这个参数涉及文件传递的需求&#xff1b;其中一句话引起了我的思考&#xff1a;“参数怎么定义&#xff1f;能不能定义成字符流&#xff1f;” 当时我沉思了一下&#xff0c;懵的 没明白她的意思 我理解的比…