【Linux基础】Linux中的开发工具(3)--make/makefile和git的使用
目录
- 前言
- 一,Linux项目自动化构建工具-make/makefile
- 1. 背景
- 2. 依赖关系和依赖方法
- 3. 项目清理
- 4. 使用方法和原理
- 5. .PHONY的作用
- 6. makefile中符号的使用
- 二,进度条的实现
- 1. 理解回车换行
- 2. 理解行缓冲区
- 3. 版本1
- 4. 版本2
- 三,Linux上git的使用
- 1. git clone
- 2. git status
- 第一斧: git add
- 第二斧: git commit -m
- 第三斧: git push
点击跳转至上一篇文章:【Linux基础】Linux中的开发工具(2)–gcc/g++使用
前言
前面已经介绍了vim编辑器,gcc/g++等基础工具的使用。本文章的主要内容是make/makefile和git的使用和原理,并且基于前面的学习完成一个基础小程序 – 进度条。
一,Linux项目自动化构建工具-make/makefile
1. 背景
- make是一条命令,makefile/Makefile是一个文件,两个搭配使用,完成项目自动化构建。
- make是一个命令工具,是一个解释makefile/Makefile中指令的命令工具。
- makefile/Makefile带来的好处就是 – “自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
2. 依赖关系和依赖方法


3. 项目清理

4. 使用方法和原理
1. makefile文件,会被make从上到下开始扫描,第一个目标名,是缺省形成的。如果我们想执行其它组的依赖关系和依赖方法,就要make name。


2. make/makefile在执行gcc命令的时候,如果发生了语法错误,就会终止。

3. make解释makefile的时候,是会自动推导的。一直推导,推导过程不执行依赖方法,直到推导有依赖文件的存在,然后再逆向执行所有的依赖方法。

5. .PHONY的作用
想要解释.PHONY的作用,我们只需对比有它和没有它时的结果,现象,再进行分析即可。


所以,.PHONY:让目标文件,对应的方法,总是被执行的。

进行分析:



6. makefile中符号的使用
1. %:makefile语法中的通配符。比如%.c:把当前目录下所有的.c文件,展开到依赖列表中。
2. $<:把依赖关系冒号右侧的依赖文件,一个一个的交给gcc -c选项,形成同名的.o文件。

3. 可定义变量:makefile中也可以定义变量,但是没有类型,名称随意取。比如bin,src。
4. $():理解为类似指针解引用的效果。

5.$ @:目标文件。
6.$ ^:所有的依赖文件列表。

我们平时编译代码,一般直接用.c源文件生成可执行程序,如下:

当然,也可以使用.PHONY生成多个可执行程序:

二,进度条的实现
使用vim,gcc/g++,make/makefile写一个偏系统的样例程序 – 进度条。
1. 理解回车换行

2. 理解行缓冲区
先来观察两段代码的运行现象:


所以,缓冲区是一段内存,输出的字符串会先暂存在缓冲区中,但是\n会强行把字符串刷出缓冲区。
缓冲区刷新策略:
使用:fflush(stdout);
进度条的实现也采用多文件形式:
process.h:放函数声明
process.c:放函数的实现
main.c:调用函数
3. 版本1
根据上面的两点理解,先实现一个简易的进度条。
process.h
#pragma once
#include <stdio.h>void proce();
main.c
#include "process.h"int main()
{proce();return 0;}
process.c
#include "process.h"
#include <string.h>
#include <unistd.h>// version1
#define NUM 101#define STYLE1 '#'#define STYLE2 '='#define STYLE3 '*'void proce(){int cnt = 0;char bar[NUM];memset(bar, '\0',sizeof(bar));//旋转光标char label[] = {'|','/','-','\\'};int len = strlen(label);while(cnt <= 100){printf("[%-100s] [%d%%] [%c] \r",bar, cnt, label[cnt%len]);fflush(stdout); //强制刷新缓冲区bar[cnt++] = STYLE2;if(cnt == NUM){bar[cnt-1] = '\0';printf("[%-100s] [%d%%] [%c] \r",bar, cnt-1, label[cnt%len]);break;}bar[cnt] = '>';usleep(50000);}printf("\n\r");}
4. 版本2
模拟真实的下载文件时的下载进度:
process.h
#pragma once
#include <stdio.h>void FlushProcess(double current, double total);
process.c
#include "process.h"
#include <string.h>
#include <unistd.h>#define NUM 101
#define STYLE '='//version2void FlushProcess(double current, double total){// 1. 更新当前进度条的百分比double rate = (current / total)*100// 2. 更新进度条主体 1% 更新一个等号char bar[NUM];memset(bar, '\0', sizeof(bar));for(int i = 0; i < (int)rate; i++){bar[i] = STYLE;}// 3. 更新旋转光标或其他风格const char* label = "|/-\\";static int num = 0;num++;int len = strlen(label);num %= len;printf("[%-100s] [%.1lf%%][%c]\r", bar, rate, label[num]);fflush(stdout);}
main.c
#include "process.h"
#include <time.h>
#include <stdlib.h>
#include <unistd.h>typedef void(*Flush_t)(double current, double total);// 这是一个刷新的函数指针类型double total = 2048.0; // 2048MBint base = 100; double once = 0.5; // 0.1MB//进度条的调用方式void download(Flush_t f){// 模拟下载过程double current = 0.0;while(current < total){int r = rand() % base + 1; // [1, 10]current += r * once;if(current >= total) current = total;usleep(50000);// 更新除本次新的下载量// 根据真实的应用场景,进行动态刷新f(current, total);}printf("\n");}int main(){srand(time(NULL));download(FlushProcess);return 0;
}
三,Linux上git的使用
注:下面介绍的git指令是最简单,最基础的git操作。也是建立在大家已经拥有自己的gitee或github的基础上。
1. git clone
使用:git clone [地址链接]
功能:获取远端仓库,使本地与远端建立联系。

2. git status
使用:git status
功能:查看git仓库的状态。

下面的三条指令是git上传"三板斧":
第一斧: git add
使用:git add [文件名]
功能:把文件添加到git的暂存区

第二斧: git commit -m
使用:git commit -m " "
功能:相当于一个提交记录
注:-m选项不能少,引号里面是写类似于日志的内容,一定要写,并且不能乱写!

第三斧: git push
使用:git push
功能:实现本地仓库与远程仓库的同步

相关文章:
【Linux基础】Linux中的开发工具(3)--make/makefile和git的使用
目录 前言一,Linux项目自动化构建工具-make/makefile1. 背景2. 依赖关系和依赖方法3. 项目清理4. 使用方法和原理5. .PHONY的作用6. makefile中符号的使用 二,进度条的实现1. 理解回车换行2. 理解行缓冲区3. 版本14. 版本2 三,Linux上git的使…...
过滤了字母、数字、_、$的webshell命令执行技巧
目录 对于php5以上首先要解决的问题有 解决技巧 1.code长度小于35位 2.没有字母、数字、_ 、$ 3.怎么把文件放进服务器 4.怎么执行文件里面的内容 1.执行Linux命令 2.执行文件里面的shell命令 5.构造完整的code参数 6.我们还可以通过修改文件里面shell命令,…...
python-A+B again
[题目描述] 小理有一个非常简单的问题给你,给你两个整数 A 和 B,你的任务是计算 AB。输入格式: 输入共 2∗T1 行。 输入的第一行包含一个整数 T 表示测试实例的个数,然后 2∗T 行,分别表示 A 和 B 两个正整数。注意整数…...
C语言—函数递归
一、递归概念 递归其实是⼀种解决问题的⽅法,在C语⾔中,递归就是函数⾃⼰调⽤⾃⼰。下面举一个例子: 上述就是⼀个简单的递归程序,只不过上⾯的递归只是为了演⽰递归的基本形式,不是为了解决问题,代码最终…...
结构开发笔记(四):solidworks软件(三):绘制36x36方块摄像头示意体
若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/141187797 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV…...
【机器学习】Caltech-101的基本概念和使用方法以及Caltech-101和ImageNet的联系和区别
引言 Caltech-101数据集是一个广泛用于对象识别任务的数据库,它包含了大约9,000张图像,这些图像来自101个不同的对象类别。每个类别包含的图像数量大约在40到800张之间,大多数类别大约有50张图像。图像的分辨率大致为300200像素 文章目录 引言…...
mysql Ubuntu安装与远程连接配置
一、安装(Ubuntu22环境安装mysql8) 这里使用Xshell链接Ubuntu和mysql windows进行操作,特别提醒:安装之前建议对Ubuntu快照处理备份,避免安装中出错导致Ubuntu崩溃。 查看是否安装的有可以用指令:ps -ef|…...
c语言中比较特殊的输入格式
目录 一.%[ ] 格式说明符 1.基本用法 (1)读取字母字符: (2)读取数字字符: (3)读取所有字符直到遇到空格: (4)读取直到换行符: 2.使用范围和组合: 3.^ 取反操作 4.注意事项 (1). 字符范围的正确表示 (2). 避免字符集中的特殊字符冲突 (3).避免空字符集 (4). 输入长…...
远程命令行控制SSH
第一次接触SSH是ROS小车作为服务端,通过ubuntu电脑客户端访问。因为机器人接键盘和屏幕操作起来不方便,所以使用SSH进行连接,方便对小车的操作。 1.服务端安装 打开终端查看ssh是否安装 sudo service ssh status 如果未安装 sudo apt upd…...
钢铁百科:A572Gr60和SA572Gr60材质分析、A572Gr60和SA572Gr60简介
A572Gr60和SA572Gr60是两种常用的结构钢板,它们在材质、执行标准、化学成分、力学性能、交货状态、应用范围和常用规格方面有所不同。 材质: A572Gr60:属于美国材料与试验协会(ASTM)标准下的A572系列高性能结构钢&…...
一次sql请求,返回分页数据和总条数
日常搬砖,总少不了需要获取分页数据和总行数。 一直以来的实践是编码两次sql请求,分别拉分页数据和totalCount。 最近我在思考: 常规实践为什么不是 在一次sql请求中中执行多次sql查询或多次更新,显而易见的优势: ① 能…...
2.5 pyautogui 实现微信自动回复
第四节:实战微信自动回复 课程目标 学习如何通过pyautogui完成微信自动回复 课程内容 编码实现 import pyautogui as pg import time from pyautogui import ImageNotFoundException import pyperclip from cnocr import CnOcr import random ocr CnOcr() msg…...
观存储历史,论数据未来
数据存储 这几天我反复观看了腾讯云社区的《中国数据库前世今生》纪录片,每次的感受都大相径庭。以下是我在这段时间里对纪录片的两个不同感想,希望感兴趣的小伙伴们也能去观看一番。 一个是关于国产数据库的发展趋势的探讨:https://blog.c…...
linux:对目录的操作
一、对目录操作 1,打开目标目录 2.读取目录,, 3.关闭目录 目录 当文件看,只不过操作函数和操作文件函数不一样。 *1.opendir DIR *opendir(const char *name); 功能:打开一个目录获得一个目录流指针 参数:name:目录名 返回值…...
详解Redis 高可用的方式 Redis Cluster
Redis 高可用方式 Redis 提供了多种高可用性方案,主要包括以下几种方式: 主从复制(Replication) 主从复制是最基本的高可用性方案,通过将数据从一个主节点复制到多个从节点来实现数据的冗余和读写分离。主节点负责所…...
$clog2(1)=0
项目场景: 写ip 时, 使用参数化的方式实现2w1r 时,出现计算读返回index 时,减下溢! 问题描述 verilog中会使用parameter 参数化,例如使用dpth 和$clog2(dpth)addr 。 常见的写法没有什么问题。 module …...
开发学习日记1
用这个系列博客记录下学习开发的一些小收获 git的使用: 说来惭愧,学到了大二,git的使用还是一团糟,记录一下如何使用git进行团队合作开发 当要加入其他人的项目时首先你要创建自己的分支(克隆一下其他分支ÿ…...
孙宇晨领航波场TRON:引领数字资产迈向崭新纪元
在风起云涌的数字资产领域,孙宇晨这个名字始终与创新、突破和引领紧密相连。作为波场TRON的创始人,他不仅是一位远见卓识的领导者,更是推动数字资产迈向新纪元的坚实力量。 自波场TRON诞生以来,孙宇晨便以其敏锐的洞察力…...
python运维(twenty-four day)
一、python基础 1、环境python2、python3 [rootpython ~]# yum list installed | grep python #检查是否有python包 [rootpython ~]# yum list installed | grep epel #检查是否有epel包 [rootpython ~]# yum -y install epel-release [rootpython ~]# yum -y instal…...
Eureka原理实践
1. 简介 1.1. 概述 Eureka是Netflix开源的一个服务注册与发现框架,它在微服务架构中扮演着至关重要的角色。 Eureka由两个核心组件组成: Eureka Server(服务注册中心):负责存储、管理和提供服务实例信息,如服务名、IP地址、端口号等。Eureka Server通常采用集群部署以保…...
第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...
【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...
汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比
在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...
【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
