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

【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的使用

目录 前言一&#xff0c;Linux项目自动化构建工具-make/makefile1. 背景2. 依赖关系和依赖方法3. 项目清理4. 使用方法和原理5. .PHONY的作用6. makefile中符号的使用 二&#xff0c;进度条的实现1. 理解回车换行2. 理解行缓冲区3. 版本14. 版本2 三&#xff0c;Linux上git的使…...

过滤了字母、数字、_、$的webshell命令执行技巧

目录 对于php5以上首先要解决的问题有 解决技巧 1.code长度小于35位 2.没有字母、数字、_ 、$ 3.怎么把文件放进服务器 4.怎么执行文件里面的内容 1.执行Linux命令 2.执行文件里面的shell命令 5.构造完整的code参数 6.我们还可以通过修改文件里面shell命令&#xff0c;…...

python-A+B again

[题目描述] 小理有一个非常简单的问题给你&#xff0c;给你两个整数 A 和 B&#xff0c;你的任务是计算 AB。输入格式&#xff1a; 输入共 2∗T1 行。 输入的第一行包含一个整数 T 表示测试实例的个数&#xff0c;然后 2∗T 行&#xff0c;分别表示 A 和 B 两个正整数。注意整数…...

C语言—函数递归

一、递归概念 递归其实是⼀种解决问题的⽅法&#xff0c;在C语⾔中&#xff0c;递归就是函数⾃⼰调⽤⾃⼰。下面举一个例子&#xff1a; 上述就是⼀个简单的递归程序&#xff0c;只不过上⾯的递归只是为了演⽰递归的基本形式&#xff0c;不是为了解决问题&#xff0c;代码最终…...

结构开发笔记(四):solidworks软件(三):绘制36x36方块摄像头示意体

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/141187797 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…...

【机器学习】Caltech-101的基本概念和使用方法以及Caltech-101和ImageNet的联系和区别

引言 Caltech-101数据集是一个广泛用于对象识别任务的数据库&#xff0c;它包含了大约9,000张图像&#xff0c;这些图像来自101个不同的对象类别。每个类别包含的图像数量大约在40到800张之间&#xff0c;大多数类别大约有50张图像。图像的分辨率大致为300200像素 文章目录 引言…...

mysql Ubuntu安装与远程连接配置

一、安装&#xff08;Ubuntu22环境安装mysql8&#xff09; 这里使用Xshell链接Ubuntu和mysql windows进行操作&#xff0c;特别提醒&#xff1a;安装之前建议对Ubuntu快照处理备份&#xff0c;避免安装中出错导致Ubuntu崩溃。 查看是否安装的有可以用指令&#xff1a;ps -ef|…...

c语言中比较特殊的输入格式

目录 一.%[ ] 格式说明符 1.基本用法 (1)读取字母字符: (2)读取数字字符: (3)读取所有字符直到遇到空格: (4)读取直到换行符: 2.使用范围和组合: 3.^ 取反操作 4.注意事项 (1). 字符范围的正确表示 (2). 避免字符集中的特殊字符冲突 (3).避免空字符集 (4). 输入长…...

远程命令行控制SSH

第一次接触SSH是ROS小车作为服务端&#xff0c;通过ubuntu电脑客户端访问。因为机器人接键盘和屏幕操作起来不方便&#xff0c;所以使用SSH进行连接&#xff0c;方便对小车的操作。 1.服务端安装 打开终端查看ssh是否安装 sudo service ssh status 如果未安装 sudo apt upd…...

钢铁百科:A572Gr60和SA572Gr60材质分析、A572Gr60和SA572Gr60简介

A572Gr60和SA572Gr60是两种常用的结构钢板&#xff0c;它们在材质、执行标准、化学成分、力学性能、交货状态、应用范围和常用规格方面有所不同。 材质&#xff1a; A572Gr60&#xff1a;属于美国材料与试验协会&#xff08;ASTM&#xff09;标准下的A572系列高性能结构钢&…...

一次sql请求,返回分页数据和总条数

日常搬砖&#xff0c;总少不了需要获取分页数据和总行数。 一直以来的实践是编码两次sql请求&#xff0c;分别拉分页数据和totalCount。 最近我在思考&#xff1a; 常规实践为什么不是 在一次sql请求中中执行多次sql查询或多次更新&#xff0c;显而易见的优势&#xff1a; ① 能…...

2.5 pyautogui 实现微信自动回复

第四节&#xff1a;实战微信自动回复 课程目标 学习如何通过pyautogui完成微信自动回复 课程内容 编码实现 import pyautogui as pg import time from pyautogui import ImageNotFoundException import pyperclip from cnocr import CnOcr import random ocr CnOcr() msg…...

观存储历史,论数据未来

数据存储 这几天我反复观看了腾讯云社区的《中国数据库前世今生》纪录片&#xff0c;每次的感受都大相径庭。以下是我在这段时间里对纪录片的两个不同感想&#xff0c;希望感兴趣的小伙伴们也能去观看一番。 一个是关于国产数据库的发展趋势的探讨&#xff1a;https://blog.c…...

linux:对目录的操作

一、对目录操作 1,打开目标目录 2.读取目录&#xff0c;&#xff0c; 3.关闭目录 目录 当文件看&#xff0c;只不过操作函数和操作文件函数不一样。 *1.opendir DIR *opendir(const char *name); 功能:打开一个目录获得一个目录流指针 参数:name:目录名 返回值&#xf…...

详解Redis 高可用的方式 Redis Cluster

Redis 高可用方式 Redis 提供了多种高可用性方案&#xff0c;主要包括以下几种方式&#xff1a; 主从复制&#xff08;Replication&#xff09; 主从复制是最基本的高可用性方案&#xff0c;通过将数据从一个主节点复制到多个从节点来实现数据的冗余和读写分离。主节点负责所…...

$clog2(1)=0

项目场景&#xff1a; 写ip 时&#xff0c; 使用参数化的方式实现2w1r 时&#xff0c;出现计算读返回index 时&#xff0c;减下溢&#xff01; 问题描述 verilog中会使用parameter 参数化&#xff0c;例如使用dpth 和$clog2(dpth)addr 。 常见的写法没有什么问题。 module …...

开发学习日记1

用这个系列博客记录下学习开发的一些小收获 git的使用&#xff1a; 说来惭愧&#xff0c;学到了大二&#xff0c;git的使用还是一团糟&#xff0c;记录一下如何使用git进行团队合作开发 当要加入其他人的项目时首先你要创建自己的分支&#xff08;克隆一下其他分支&#xff…...

孙宇晨领航波场TRON:引领数字资产迈向崭新纪元

​ 在风起云涌的数字资产领域&#xff0c;孙宇晨这个名字始终与创新、突破和引领紧密相连。作为波场TRON的创始人&#xff0c;他不仅是一位远见卓识的领导者&#xff0c;更是推动数字资产迈向新纪元的坚实力量。 自波场TRON诞生以来&#xff0c;孙宇晨便以其敏锐的洞察力…...

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通常采用集群部署以保…...

Ant-Design-Vue快速上手指南+排坑

1. 简介 1.1. 概述 Ant-Design-Vue是由阿里巴巴开源的一个基于Vue.js框架的企业级UI设计语言。它旨在帮助开发者构建设计优雅、体验流畅的企业级应用。Ant-Design-Vue提供了一系列高质量的Vue组件,包括表单、表格、布局、导航、图标等,可以帮助开发者快速搭建应用程序界面。…...

mysql5.7安装

1.创建一个software文件 2.先下载mysql的repo源 wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm 3安装源包 rpm -ivh mysql-community-release-el7-5.noarch.rpm 可能会报错 改成命令 rpm -ivh mysql-community-release-el7-5.noarch.rpm --nodeps…...

UE开发中的设计模式(三) —— 对象池模式

在FPS游戏中&#xff0c;射击会生成子弹&#xff0c;在命中敌人后子弹会被销毁&#xff0c;那么会导致子弹对象频繁地创建和销毁&#xff0c;会造成运行效率降低且会产生内存碎片问题&#xff0c;而对象池模式可以很好地解决这个问题。 文章目录 问题提出概述问题解决总结 问题…...

Mocha测试框架:JavaScript自动化测试的瑞士军刀

在JavaScript开发中&#xff0c;自动化测试是确保代码质量和可靠性的关键环节。Mocha是一个广泛使用的JavaScript测试框架&#xff0c;它支持多种断言库&#xff0c;允许开发者编写简洁、灵活的测试用例。Mocha特别适用于Node.js环境&#xff0c;但也可以在浏览器中运行。本文将…...

flask实现Streaming内容传输

当传输大量内存&#xff0c;以至于超出内存大小&#xff0c;一般http服务器会报500错误&#xff0c;这时可以使用Streaming流的方式来传输内容&#xff0c;类似ChatGPT和视频流那样的输出方式&#xff0c;flask里要用到生成器和直接响应。 from flask import stream_with_cont…...

seata的使用(SpringBoot项目整合seata)

文章目录 1、解压 seata-server-1.7.1.zip2、启动 双击 seata-server.bat3、启动 seata 控制台用户界面4、所有分布式事务相关数据库要有undo-log5、项目引入seata依赖6、项目添加seata配置7、代码实现&#xff1a; 1、解压 seata-server-1.7.1.zip 2、启动 双击 seata-server.…...

docker容器和宿主机网络不通

防火墙未开启&#xff0c;检查网络配置无异常 解决&#xff1a; [rootlocalhost ~]# vim /etc/sysctl.confnet.bridge.beidge-nf-call-iptables 1 net.bridge.beidge-nf-call-ip6tables 1[rootlocalhost ~]# sysctl -p [rootlocalhost ~]# systemctl restart docker 如果网…...

编程学习之旅:高效记录与整理笔记的艺术

引言&#xff1a;知识的海洋与导航的灯塔 在编程的浩瀚星空中&#xff0c;每一位学习者都像是勇敢的航海家&#xff0c;驾驶着知识的帆船&#xff0c;在无尽的信息海洋中探索未知的领域。然而&#xff0c;这片海洋既充满了机遇&#xff0c;也潜藏着挑战。信息的过载、知识的碎…...

dev c++中,在C++11模式下编译带M_PI宏的文件报错的解决办法

一、问题描述 当使用C11的模式&#xff0c;编译引用了math库中的M_PI的源文件时&#xff0c;报M_PI未声明的错误。 二、问题原因 因为M_PI是GNU扩展的宏&#xff0c;它不属于C11的标准&#xff0c;而-stdc11&#xff0c;表示以C11的标准进行编译&#xff0c;因此会产生以上问…...

【ubutnu24.04】k8s部署2:摸索修复问题

1.30.0 一直init失败有人说版本兼容问题重新安装了最新的1.31.0 版本kubeadm init 仍旧失败。安装依赖项 sudo apt-get install -y apt-transport-https ca-certificates curl gpgroot@PerfSvr:/home/zhangbin/perfwork/k8sadmin# sudo apt-get install -y apt-transport-https…...