【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 如何使用?
-
debug模式编译
-
gcc -g test.c -o test.out
-
-
进入gdb模式
-
gdb test.out
-
-
基本操作
- 运行程序:r或run
- 逐过程:n或next
- 逐语句:s或step
- 执行完成当前函数:finish
- 执行到下一个断点处:c或continue
- 执行到指定行:until 行号
-
显示源代码:l或list
- 显示指定行的源代码(每次10行):l/list 行号
- 从上次的位置开始显示:l/list
- 显示指定函数的源代码:l/list 函数名
-
断点相关
-
设置断点
-
在指定行设置断点:b/break 行号
-
在指定函数的入口处设置断点:b/break 函数名
-
-
查看断点信息: i b/info b
-
删除断点:d 断点号
-
删除所有断点:delete breakpoints
-
禁用断点:disable 断点号
-
启用断点:enable 断点号
-
-
监视器
- 临时显示变量或表达式的值:p/print 表达式
- 监视变量或表达式的值:display 表达式
- 取消监视变量或表达式的值:undisplay 表达式编号
- 显示当前栈帧局部变量的值:i/info locals
- 调试时修改变量的值:set var 变量=#
-
调用堆栈
- 查看各级函数调用及参数:bt/breaktrace
-
退出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. 规则模板
2. 写明依赖关系和依赖方法
-
一般写法
-
依赖关系:上图中可执行程序mycode的生成依赖于mycode.c源文件
-
依赖方法:gcc -o mycode mycode.c就是对应的依赖关系
注意:写依赖方法前要加Tab进行缩进
-
-
特殊符号简写
- $@:表示目标文件(图中的mycode文件)
- $^:表示所依赖的文件列表(图中的mycode.c文件)
3. 写明项目清理方法
- 有时工程是需要被清理的,以便重新编译。
- make扫描Makefile文件的时候,默认会形成一个目标依赖关系,一般是第一个!在执行make空命令时,会自动执行目标依赖关系。
- 像clean这种,没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动执行,不过,我们可以显式的要求make执行。即命令——“make clean”,以此来清除所有的目标文件,以便重新编译。
- .PHONY:用于修饰对应的符号,表示伪目标。被修饰的符号总是可以被执行。
5.3 多文件编译
- 多文件编译的框架:
-
编写src目录下的makefile文件
生成目标文件:将各源文件编译成目标文件,并将生成的目标文件移动到obj目录下。
-
编写obj目录下的makefile文件
生成可执行程序:将所有目标文件与库文件进行链接,形成可执行程序。并将生成的可执行程序移动到bin目录下
-
编写项目主目录下的Makefile文件
总控:全局:先后到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
-
常用命令
-
git clone:将gitee云中的仓库拷贝到本地
-
git status:查看当前仓库的状态包括:待添加的文件,待提交的文件等
-
git log:显示当前仓库的提交记录和日志信息
-
git add:添加文件到待提交文件列表
-
git reset HEAD:取消设置待提交文件
-
git commit:将待提交文件提交到本地仓库
- git commit -m “日志信息” //提交必须填写日志信息
- git commit -m -a “日志信息” //未添加文件而只是删除文件
-
git push:将本地仓库中的内容上传到gitee云
-
相关文章:

【Linux系统】开发工具(下) {调试器gdb,自动化构建工具make/Makefile,多文件编译,代码管理平台git}
【Linux系统】开发工具(上) {软件包管理器yum,更新yum源,文本编辑器vim,vim的三种基本模式,vim指令集,代码编译器gcc/g} 四、Linux调试器:gdb 4.1 debug模式 程序的编译模式有两种,debug模式和…...
线性代数——行列式
文章目录版权声明排列行列式行列式的由来行列式的概念行列式的性质重要公式克拉默法则补充知识版权声明 本文大部分内容皆来自李永乐老师考研教材和视频课。 排列 由1,2,…,n1,2,\ldots,n1,2,…,n组成的有序数组称为一个nnn阶排列,通常使用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包的方式,PySpark不需要打包所以开发效率极高,早点搞完早点下班】,遇到一个令所有SQL Boy都很头疼的问题,那就…...

【CDH】cloudera manger 如何开启Debug 日志调试模式
前言 在安装 Cloudera Manger 时,遇到报错,需要开启Debug 日志级别来排查下问题原因。这里记录下 CM 如何开启 Debug 级别。 方法一:为整个服务启动DEBUG 如果 CM 无法启动,则可以为整个服务器启用 DEBUG 或 TRACE。 警告&…...
SQL Server 用户授权与回收
创建xxbbbb账号,账号可以在Company_report20221019.dbo.qfacccmprf表中进行select、 insert,update,delete --创建登录账号 create login xxbbbb with password12345#---创建用户 use Company_report20221019 create user xxbbbb for login xxbbbb---将qfacccmprf表…...

电脑出现乱码的原因以及解决方法
在日常使用电脑的过程中,经常会遇到电脑出现乱码,那么为什么会出现乱码呢?出现乱码又该怎么解决呢?下面我们一起来了解一下。 出现乱码的原因 系统乱码:主要是Windows中显示乱码,比如菜单、桌面、启动界面…...
网络工程师笔记
第一天: 编码就是转化为数字信号;调制就是转化为模拟信号; 调制: 1、基带调制(不改变频率,只改变波形) 2、带通调制(迁移到较高的频段进行传输) (1&…...
linux用户添加用户组与目录切换用户组的操作记录
linux用户添加到多个组 usermod -G groupname username (这种会把用户从其他组中去掉,只属于该组) 如:usermod -G git git (git只属于git组) usermod -a -G groupname username (把用户添加到这个组,之前所属组不影响) 如:usermod…...
在CentOS 7上使用二进制文件安装单节点Kubernetes的详细步骤:
确保您的系统已经安装了Docker和etcd。如果没有,请按照以下命令安装它们: yum install docker etcd 启动Docker服务并将其设置为开机自启: systemctl start docker systemctl enable docker 下载所需的Kubernetes二进制文件。您可以从以下网…...

iCollections for mac 8.0.6.80608 保持Mac桌面的整洁
应用介绍 iCollections允许您在桌面上创建区域,以便您可以排序和排列图标。这可以帮助您将相关项目保持在一起,以便文件(图片,文档,屏幕截图,应用程序等)井井有条且易于查找。 小麦测试可以按照…...

学习HM微博项目第8天
步骤:发微博01-导航栏内容 -> 发微博02-自定义TextView -> 发微博03-完善TextView和发送微博按钮 -> 发微博04-显示工具条 -> 发微博05-封装工具条和相册 -> 发微博06-发送微博 发微博01-导航栏内容 APP的演示操作: 从APP的演示操作中可…...

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

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

浅析可观测系统中sdk的不同引入方式的利与弊
文章前提是不考虑sw的方式引入,同时不考虑在nginx等自动注入js脚本的方式,那么基本就是两种大的形式:cdn引入和本地引入其中cdn引入有两种:cdn同步cdn异步本地引入有两种:npm本地js文件参考知识提前先补充一张图片正文…...
Google Earth导入经纬高(txt文件)
目录 一、提取GNSS数据生成txt文本文件 二、Google Earth导入txt文件 1、启动Google Earth 2、打开vig_result.txt...

Unity客户端开发工程师的进阶之路
UWA技能成长系统是UWA根据学员的职业发展目标,提供技能学习的推荐路径,再将所需学习内容按难易等多维度,设计分成多个学习阶段,可以循序渐进地进行学习。 进入技能成长体系,目标选择高级客户端开发工程师(U…...
2023年全国最新高校辅导员精选真题及答案34
百分百题库提供高校辅导员考试试题、辅导员考试预测题、高校辅导员考试真题、辅导员证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 72.心理发展的特点是()。 A.方向性与不可逆性 B.连续性与阶段性…...
chatGPT身份指令
充当 Linux 终端 我想让你充当 Linux 终端。我将输入命令,您将回复终端应显示的内容。我希望您只在一个唯一的代码块内回复终端输出,而不是其他任何内容。不要写解释。除非我指示您这样做,否则不要键入命令。当我需要用英语告诉你一些事情时&…...

基于springboot实现私人健身与教练预约管理系统【源码+论文】分享
基于springboot实现私人健身与教练预约管理系统演示开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea M…...

wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...

【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
Mysql8 忘记密码重置,以及问题解决
1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...