当前位置: 首页 > news >正文

【Linux系统】开发工具(下) {调试器gdb,自动化构建工具make/Makefile,多文件编译,代码管理平台git}

【Linux系统】开发工具(上) {软件包管理器yum,更新yum源,文本编辑器vim,vim的三种基本模式,vim指令集,代码编译器gcc/g++}


四、Linux调试器:gdb

4.1 debug模式

  • 程序的编译模式有两种,debug模式和release模式
    • debug模式:加入了调试信息,使程序可已被调试。但体量较大,运行较慢。
    • release模式:可执行程序中没有调试信息,不可被调试。但程序体量小;且编译器对程序做相关优化,运行速度快。
  • Linux gcc/g++编译出来的二进制程序,默认是release模式
  • 要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项

4.2 如何使用?

  1. debug模式编译

    • gcc -g test.c -o test.out
      
  2. 进入gdb模式

    • gdb test.out
      
  3. 基本操作

    1. 运行程序:r或run
    2. 逐过程:n或next
    3. 逐语句:s或step
    4. 执行完成当前函数:finish
    5. 执行到下一个断点处:c或continue
    6. 执行到指定行:until 行号
  4. 显示源代码:l或list

    1. 显示指定行的源代码(每次10行):l/list 行号
    2. 从上次的位置开始显示:l/list
    3. 显示指定函数的源代码:l/list 函数名
  5. 断点相关

    1. 设置断点

      1. 在指定行设置断点:b/break 行号

      2. 在指定函数的入口处设置断点:b/break 函数名

    2. 查看断点信息: i b/info b

    3. 删除断点:d 断点号

    4. 删除所有断点:delete breakpoints

    5. 禁用断点:disable 断点号

    6. 启用断点:enable 断点号

  6. 监视器

    1. 临时显示变量或表达式的值:p/print 表达式
    2. 监视变量或表达式的值:display 表达式
    3. 取消监视变量或表达式的值:undisplay 表达式编号
    4. 显示当前栈帧局部变量的值:i/info locals
    5. 调试时修改变量的值:set var 变量=#
  7. 调用堆栈

    1. 查看各级函数调用及参数:bt/breaktrace
  8. 退出gdb:quit 或 ctrl + d


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

5.1 什么是make/Makefile?

  • make/Makefile用于维护文件和文件之间的相互依赖关系,由多文件形成可执行程序。简单来说,make/Makefile用于进行多文件编译

  • makefile文件

    • 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作。
    • makefile是一个文件,记录了文件间的依赖关系和依赖方法。makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
  • make命令

    • make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。
    • make是一条命令,makefile是一个文件,两个搭配使用,完成项目的自动化构建。

5.2 如何写Makefile文件?

1. 规则模板

img

2. 写明依赖关系和依赖方法

  • 一般写法
    在这里插入图片描述

    • 依赖关系:上图中可执行程序mycode的生成依赖于mycode.c源文件

    • 依赖方法:gcc -o mycode mycode.c就是对应的依赖关系

    注意:写依赖方法前要加Tab进行缩进

  • 特殊符号简写
    在这里插入图片描述

    • $@:表示目标文件(图中的mycode文件)
    • $^:表示所依赖的文件列表(图中的mycode.c文件)

3. 写明项目清理方法
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5xYX3NyS-1680169559237)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230328115148743.png)]

  • 有时工程是需要被清理的,以便重新编译。
  • make扫描Makefile文件的时候,默认会形成一个目标依赖关系,一般是第一个!在执行make空命令时,会自动执行目标依赖关系。
  • 像clean这种,没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动执行,不过,我们可以显式的要求make执行。即命令——“make clean”,以此来清除所有的目标文件,以便重新编译。
  • .PHONY:用于修饰对应的符号,表示伪目标。被修饰的符号总是可以被执行。

5.3 多文件编译

  • 多文件编译的框架:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hr1RRsfg-1680169559242)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230330152410704.png)]

  • 编写src目录下的makefile文件

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8eylKrS0-1680169559243)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230329204336079.png)]

    生成目标文件:将各源文件编译成目标文件,并将生成的目标文件移动到obj目录下。

  • 编写obj目录下的makefile文件

    img

    生成可执行程序:将所有目标文件与库文件进行链接,形成可执行程序。并将生成的可执行程序移动到bin目录下

  • 编写项目主目录下的Makefile文件

    img

    总控:全局:先后到src和obj目录下生成目标文件和可执行程序。还可以进行项目清理,以便重新生成。

  • 为什么要分两步编译?

    • 程序编译一般分两步:.c->.o,.o->.out

    • 分两步两步编译是因为:如果其中某个源文件存在问题,调试修改后只需要将这个存在问题的源文件重新编译成目标文件即可。其他h的目标文件直接链接,不用再次编译

    • 如果一步直接.c->.out其中的.o文件没有保存,则若每次修改其中某个.c文件都需要把所有文件都重新编译一次浪费时间。


六、Linux小程序:进度条

6.1 行缓冲区

#include <stdio.h>
int main()
{
printf("hello Makefile!");
sleep(3);
return 0;
}
  • printf已经执行,但是数据没有被立即刷新到显示器上。

  • 显示器设备的刷新策略是行刷新,即遇到\n进行刷新。

  • 使用printf输出的字符串只有遇到换行符\n才会刷新到显示器。在此之前字符串会被暂存在此C程序的行缓冲区中。

  • 当然,我们也可以使用fflush函数将缓冲区中的数据立即刷新到标准输出(显示器)。

6.2 进度条代码

#include <stdio.h>                           
#include <unistd.h>                      
#include <string.h>                      int main(){                              char bar[101];                         char *label="|/-\\";                   memset(bar,0,sizeof(bar));             for(int i = 0; i <= 100; i++)          {                                      printf("[%c][%-100s][%-3d%%]\r",label[i%4],bar,i);    fflush(stdout);                      bar[i]='#';                          usleep(50000);                       }                                      printf("\n");                          return 0;                              
} 

七、代码管理平台:git

  • 常用命令

    1. git clone:将gitee云中的仓库拷贝到本地

    2. git status:查看当前仓库的状态包括:待添加的文件,待提交的文件等

    3. git log:显示当前仓库的提交记录和日志信息

    4. git add:添加文件到待提交文件列表

    5. git reset HEAD:取消设置待提交文件

    6. git commit:将待提交文件提交到本地仓库

      • git commit -m “日志信息” //提交必须填写日志信息
      • git commit -m -a “日志信息” //未添加文件而只是删除文件
    7. git push:将本地仓库中的内容上传到gitee云

相关文章:

【Linux系统】开发工具(下) {调试器gdb,自动化构建工具make/Makefile,多文件编译,代码管理平台git}

【Linux系统】开发工具(上) {软件包管理器yum&#xff0c;更新yum源&#xff0c;文本编辑器vim&#xff0c;vim的三种基本模式&#xff0c;vim指令集&#xff0c;代码编译器gcc/g} 四、Linux调试器&#xff1a;gdb 4.1 debug模式 程序的编译模式有两种&#xff0c;debug模式和…...

线性代数——行列式

文章目录版权声明排列行列式行列式的由来行列式的概念行列式的性质重要公式克拉默法则补充知识版权声明 本文大部分内容皆来自李永乐老师考研教材和视频课。 排列 由1,2,…,n1,2,\ldots,n1,2,…,n组成的有序数组称为一个nnn阶排列&#xff0c;通常使用j1j2…jnj_1j_2\ldots …...

Spring注解-Spring-boot-SpingAOP

Spring各个模块 Test 对应spring-test.jar. Spring提供的测试工具, 可以整合JUnit测试, 简化测试环节. Core Container ​ Spring的核心组件, 包含了Spring框架最基本的支撑. ​ Beans, 对应spring-beans.jar. Spring进行对象管理时依赖的jar包. ​ Core, 对应spring-core.jar,…...

使用Shell传参解决DataPhin中PySpark不支持中文的问题

使用Shell传参解决DataPhin中PySpark不支持中文的问题 背景 笔者开发PySpark任务时【别问为神马不用Java和Scala打Jar包的方式&#xff0c;PySpark不需要打包所以开发效率极高&#xff0c;早点搞完早点下班】&#xff0c;遇到一个令所有SQL Boy都很头疼的问题&#xff0c;那就…...

【CDH】cloudera manger 如何开启Debug 日志调试模式

前言 在安装 Cloudera Manger 时&#xff0c;遇到报错&#xff0c;需要开启Debug 日志级别来排查下问题原因。这里记录下 CM 如何开启 Debug 级别。 方法一&#xff1a;为整个服务启动DEBUG 如果 CM 无法启动&#xff0c;则可以为整个服务器启用 DEBUG 或 TRACE。 警告&…...

SQL Server 用户授权与回收

创建xxbbbb账号&#xff0c;账号可以在Company_report20221019.dbo.qfacccmprf表中进行select、 insert,update,delete --创建登录账号 create login xxbbbb with password12345#---创建用户 use Company_report20221019 create user xxbbbb for login xxbbbb---将qfacccmprf表…...

电脑出现乱码的原因以及解决方法

在日常使用电脑的过程中&#xff0c;经常会遇到电脑出现乱码&#xff0c;那么为什么会出现乱码呢&#xff1f;出现乱码又该怎么解决呢&#xff1f;下面我们一起来了解一下。 出现乱码的原因 系统乱码&#xff1a;主要是Windows中显示乱码&#xff0c;比如菜单、桌面、启动界面…...

网络工程师笔记

第一天&#xff1a; 编码就是转化为数字信号&#xff1b;调制就是转化为模拟信号&#xff1b; 调制&#xff1a; 1、基带调制&#xff08;不改变频率&#xff0c;只改变波形&#xff09; 2、带通调制&#xff08;迁移到较高的频段进行传输&#xff09; &#xff08;1&…...

linux用户添加用户组与目录切换用户组的操作记录

linux用户添加到多个组 usermod -G groupname username (这种会把用户从其他组中去掉&#xff0c;只属于该组) 如&#xff1a;usermod -G git git (git只属于git组) usermod -a -G groupname username (把用户添加到这个组&#xff0c;之前所属组不影响) 如&#xff1a;usermod…...

在CentOS 7上使用二进制文件安装单节点Kubernetes的详细步骤:

确保您的系统已经安装了Docker和etcd。如果没有&#xff0c;请按照以下命令安装它们&#xff1a; yum install docker etcd 启动Docker服务并将其设置为开机自启&#xff1a; systemctl start docker systemctl enable docker 下载所需的Kubernetes二进制文件。您可以从以下网…...

iCollections for mac 8.0.6.80608 保持Mac桌面的整洁

应用介绍 iCollections允许您在桌面上创建区域&#xff0c;以便您可以排序和排列图标。这可以帮助您将相关项目保持在一起&#xff0c;以便文件&#xff08;图片&#xff0c;文档&#xff0c;屏幕截图&#xff0c;应用程序等&#xff09;井井有条且易于查找。 小麦测试可以按照…...

学习HM微博项目第8天

步骤&#xff1a;发微博01-导航栏内容 -> 发微博02-自定义TextView -> 发微博03-完善TextView和发送微博按钮 -> 发微博04-显示工具条 -> 发微博05-封装工具条和相册 -> 发微博06-发送微博 发微博01-导航栏内容 APP的演示操作&#xff1a; 从APP的演示操作中可…...

十五、存储过程与函数

一、存储过程概述 1、简介 含义&#xff1a;存储过程的英文是 Stored Procedure 。它的思想很简单&#xff0c;就是一组经过 预先编译 的 SQL 语句的封装 执行过程&#xff1a;存储过程预先存储在 MySQL 服务器上&#xff0c;需要执行的时候&#xff0c;客户端只需要向服务器…...

php实现助记词转TRX,ETH 私钥和钱包地址

TRX助记词转地址网上都是Java&#xff0c;js或其他语言开发的示例&#xff0c;一个简单的功能需要依赖其他环境来实现表示不能忍&#xff0c;毕竟php是世界上最好的语言。【狗头】 一、知识准备 要实现助记词转TRX私钥和地址&#xff0c;先需要知道助记词和私钥钱包地址之间的…...

浅析可观测系统中sdk的不同引入方式的利与弊

文章前提是不考虑sw的方式引入&#xff0c;同时不考虑在nginx等自动注入js脚本的方式&#xff0c;那么基本就是两种大的形式&#xff1a;cdn引入和本地引入其中cdn引入有两种&#xff1a;cdn同步cdn异步本地引入有两种&#xff1a;npm本地js文件参考知识提前先补充一张图片正文…...

Google Earth导入经纬高(txt文件)

目录 一、提取GNSS数据生成txt文本文件 二、Google Earth导入txt文件 1、启动Google Earth 2、打开vig_result.txt...

Unity客户端开发工程师的进阶之路

UWA技能成长系统是UWA根据学员的职业发展目标&#xff0c;提供技能学习的推荐路径&#xff0c;再将所需学习内容按难易等多维度&#xff0c;设计分成多个学习阶段&#xff0c;可以循序渐进地进行学习。 进入技能成长体系&#xff0c;目标选择高级客户端开发工程师&#xff08;U…...

2023年全国最新高校辅导员精选真题及答案34

百分百题库提供高校辅导员考试试题、辅导员考试预测题、高校辅导员考试真题、辅导员证考试题库等&#xff0c;提供在线做题刷题&#xff0c;在线模拟考试&#xff0c;助你考试轻松过关。 72.心理发展的特点是&#xff08;&#xff09;。 A.方向性与不可逆性 B.连续性与阶段性…...

chatGPT身份指令

充当 Linux 终端 我想让你充当 Linux 终端。我将输入命令&#xff0c;您将回复终端应显示的内容。我希望您只在一个唯一的代码块内回复终端输出&#xff0c;而不是其他任何内容。不要写解释。除非我指示您这样做&#xff0c;否则不要键入命令。当我需要用英语告诉你一些事情时&…...

基于springboot实现私人健身与教练预约管理系统【源码+论文】分享

基于springboot实现私人健身与教练预约管理系统演示开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea M…...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

&#x1f9e0; 智能合约中的数据是如何在区块链中保持一致的&#xff1f; 为什么所有区块链节点都能得出相同结果&#xff1f;合约调用这么复杂&#xff0c;状态真能保持一致吗&#xff1f;本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

Mysql中select查询语句的执行过程

目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析&#xff08;Parser&#xff09; 2.4、执行sql 1. 预处理&#xff08;Preprocessor&#xff09; 2. 查询优化器&#xff08;Optimizer&#xff09; 3. 执行器…...

基于Java+MySQL实现(GUI)客户管理系统

客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息&#xff0c;对客户进行统一管理&#xff0c;可以把所有客户信息录入系统&#xff0c;进行维护和统计功能。可通过文件的方式保存相关录入数据&#xff0c;对…...

水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关

在水泥厂的生产流程中&#xff0c;工业自动化网关起着至关重要的作用&#xff0c;尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关&#xff0c;为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多&#xff0c;其中不少设备采用Devicenet协议。Devicen…...

macOS 终端智能代理检测

&#x1f9e0; 终端智能代理检测&#xff1a;自动判断是否需要设置代理访问 GitHub 在开发中&#xff0c;使用 GitHub 是非常常见的需求。但有时候我们会发现某些命令失败、插件无法更新&#xff0c;例如&#xff1a; fatal: unable to access https://github.com/ohmyzsh/oh…...

用 Rust 重写 Linux 内核模块实战:迈向安全内核的新篇章

用 Rust 重写 Linux 内核模块实战&#xff1a;迈向安全内核的新篇章 ​​摘要&#xff1a;​​ 操作系统内核的安全性、稳定性至关重要。传统 Linux 内核模块开发长期依赖于 C 语言&#xff0c;受限于 C 语言本身的内存安全和并发安全问题&#xff0c;开发复杂模块极易引入难以…...

基于小程序老人监护管理系统源码数据库文档

摘 要 近年来&#xff0c;随着我国人口老龄化问题日益严重&#xff0c;独居和居住养老机构的的老年人数量越来越多。而随着老年人数量的逐步增长&#xff0c;随之而来的是日益突出的老年人问题&#xff0c;尤其是老年人的健康问题&#xff0c;尤其是老年人产生健康问题后&…...

生信服务器 | 做生信为什么推荐使用Linux服务器?

原文链接&#xff1a;生信服务器 | 做生信为什么推荐使用Linux服务器&#xff1f; 一、 做生信为什么推荐使用服务器&#xff1f; 大家好&#xff0c;我是小杜。在做生信分析的同学&#xff0c;或是将接触学习生信分析的同学&#xff0c;<font style"color:rgb(53, 1…...

[QMT量化交易小白入门]-六十二、ETF轮动中简单的评分算法如何获取历史年化收益32.7%

本专栏主要是介绍QMT的基础用法,常见函数,写策略的方法,也会分享一些量化交易的思路,大概会写100篇左右。 QMT的相关资料较少,在使用过程中不断的摸索,遇到了一些问题,记录下来和大家一起沟通,共同进步。 文章目录 相关阅读1. 策略概述2. 趋势评分模块3 代码解析4 木头…...