【Linux】自动化构建工具make/Makefile和git介绍
🌈个人主页:秦jh__https://blog.csdn.net/qinjh_?spm=1010.2135.3001.5343
🔥 系列专栏:https://blog.csdn.net/qinjh_/category_12625432.html
目录
前言
Linux项目自动化构建工具-make/Makefile
举例
.PHONY
常见符号
依赖关系实例
Linux第一个小程序-进度条
缓冲区编辑
进度条版本1(直接显示)
版本2(下载场景)
Main.c
Processbar.c
Processbar.h
使用 git 命令行
安装 git
使用 Gitee 创建项目
拉取
编辑编辑
本地传到远程
过程解释
修改内容
前言
💬 hello! 各位铁子们大家好哇。
今日更新了Linux的make和git的内容
🎉 欢迎大家关注🔍点赞👍收藏⭐️留言📝
Linux项目自动化构建工具-make/Makefile
make是一个命令工具,是一个解释makefile中指令的命令工具,make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。
举例
依赖文件列表以空格进行分割,依赖文件列表可以为空,如上方的clean。上方直接使用make,为什么会执行第一对依赖关系呢?因为如果make后面什么都不跟,就会默认执行第一对依赖关系。make是从上往下执行的。
.PHONY
格式: .PHONY:XXX 作用:修饰后XXX对应的方法总是要被执行的。
上方make使用一次后就不能继续使用了,是因为此时生成的可执行程序已经是最新的了,不需要更新。如果这里的目标文件也被,PHONY修饰,也可以一直执行。
这里的更新实际是对比可执行文件和源文件的各自的最近修改时间,如果可执行文件最新,就不会编译,如果源文件最新,就会重新编译(即新旧时间的对比)。
常见符号
$@是指取目标文件,$^是指取依赖文件列表。$的作用是取符号的内容。
vim里面也可以定义变量的。直接用=号,两边不要空格 。这里的定义变量就相当于c语言里的宏一样,可以进行替换。
@符号的作用:在外面执行指令时,不会打印出依赖方法 。
一对依赖关系不止只有一个依赖方法。如上图,还可以发现,echo打印的语句里面$(src)也会被进行替换。
依赖关系实例
在makefile里面,注释是用 #。 make指令原本只会执行第一对依赖关系,但是上面例子却把后面的几对依赖关系都执行了。
原理:
- make会在当前目录下找名字叫“Makefile”或“makefile”的文件。
- 如果找到,它会找文件中的第一个目标文件,并把这个文件作为最终的目标文件。
- 如果该文件不存在,他就会执行后面所定义的命令来生成这个文件。
- 如果所依赖的code.o文件不存在,那么make会在当前文件中找目标为code.o文件的依赖性,如果找到则再根据那一个规则生成code.o文件。(这有点像一个堆栈的过程)
- 然后再用 code.o 文件声明 make的终极任务,也就是执行文件cod.exe了。
- make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。
- 在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错, 而对于所定义的命令的错误,或是编译不成功,make根本不理。
上面除了第一对依赖关系不能改变位置,因为他是终极任务,后面几对依赖关系的顺序可以随便换。
Linux第一个小程序-进度条
缓冲区
运行可执行程序后,发现打印完成后,会停留3秒然后才显示下一个命令行。
当我们把’\n"去掉后,发现运行时,会先停留3秒,然后才会打印。 这是因为此时要打印的内容都在缓冲区里面。程序结束的时候,一般会自动冲刷缓冲区。
如果把"\n"放到中间,就会先打印包括\n的前面的内容,休眠3秒后再打印后面的内容。
冲刷缓冲区有三种方法:
- \n
- 缓冲区满了
- 强制刷新:fflush
stdout就是显示器的意思。缓冲区是以行刷新的,如果不想换行,就可以用fflush刷新。
上面是打印倒计时的程序,不过在运行时,为什么不会进行打印呢?因为\r会让光标回到行首,光标指的地方,内容就被覆盖了,下图是在VS中测试的结果,此时光标在3的位置,3就被覆盖了,无法打印出来。
我们只需要fflush强制冲刷缓冲区就可以解决了。
如果我们把倒计时从10开始,会发现打印时后面会多一个0。因为我们打印时,打印的是字符,光标没有移动到后面,就不会把10后面的0覆盖掉。只需要在%后面加上-2即可,如下图:
进度条版本1(直接显示)
版本2(下载场景)
Main.c
#include "Processbar.h"double bandwidth=1024*1024*1.0;//donwload
void download(double filesize,callback_t cb)
{double current=0.0;printf("download begin,current:%lf\n",current);while(current<=filesize){cb(filesize,current);current+=bandwidth;usleep(10000);}printf("\ndownload done,filesize:%lf\n",filesize);
}int main()
{download(100*1024*1024,Procbar);download(20*1024*1024,Procbar);download(3*1024*1024,Procbar);download(125*1024*1024,Procbar);//Procbar(100.0,46.2);//Procbar(100.0,77.8);//Procbar(100.0,99.9);// Procbar();// ForTest();return 0;
}
Processbar.c
#include "Processbar.h"
#include<string.h>
#include<unistd.h>#define Length 101
#define Style '#'const char* label="|/-\\";//version1
//void Procbar()
//{
// char bar[Length];
// memset(bar,'\0',sizeof(bar));
// int len=strlen(label);
//
// int cnt=0;
// while(cnt<=100)
// {
// printf("[%-100s][%3d%%][%c]\r",bar,cnt,label[cnt%len]);
// fflush(stdout);
// bar[cnt++]=Style;
// usleep(20000);
// }
// printf("\n");
//}//version 2
void Procbar(double total,double current)
{char bar[Length];memset(bar,'\0',sizeof(bar));int len=strlen(label);int cnt=0;double rate=(current*100.0)/total;int loop_count=(int)rate;while(cnt<=loop_count){bar[cnt++]=Style;// usleep(20000);}printf("[%-100s][%.1lf%%][%c]\r",bar,rate,label[cnt%len]);fflush(stdout);
}//void ForTest()
//{
// printf("This is for test\n");
// printf("This is for test\n");
// printf("This is for test\n");
// printf("This is for test\n");
// printf("This is for test\n");
// printf("This is for test\n");
//}
Processbar.h
#pragma once #include <stdio.h>
typedef void(*callback_t)(double,double);void Procbar(double total,double current);//void Procbar();//extern void ForTest();
头文件中typedef了一个函数,Main.c文件的download函数有一个函数参数。原因:如果后期需要图形化界面,传参传别的函数就可以了,不需要改变现在的函数。
运行结果图:
使用 git 命令行
安装 git
sudo yum install -y git
使用 Gitee 创建项目
git是一个工具,gitee、github就是为这个工具搭建的网站,即可视化。
初始化,语言选择你自己的语言。,模板勾选第一个就行 ,readme就是这个仓库简单的说明,创建后会自动生成中文和英文的说明。分支选择单分支就行。
创建完仓库后,还需要在本地进行配置,复制粘贴即可。
拉取
复制然后粘贴,这时就把远程仓库,拉取下来了。我们还能.git隐藏文件,它就是我们的工作目录,我们不能去修改它,不然就很容易出错。
本地传到远程
我们想把要上传的内容cp到本地,然后git status查看本地和远端仓库的状态,这里显示process是没有被添加到本地仓库的。
使用git add 后面可以是文件名,也可以是 . ,.就是把当前位置的所有文件都添加到本地仓库。
-m 后面跟的是本次提交的日志,必须要写,不能省略。 此步骤是把内容提交到本地仓库中,跟远端没有关系。
最后一步,git push 后,输入用户名和密码即可完成同步。这时就可以看到已经上传完毕了。
过程解释
.git目录也就是git的本地仓库,add会把上传的内容中,有变化的部分放到一个暂存区。
commit会把暂存区里的内容真正上传到本地仓库,并清空暂存区。最后push就是把本地仓库跟远端进行同步。
修改内容
修改后,还是按照流程add、commit、push操作即可。
相关文章:

【Linux】自动化构建工具make/Makefile和git介绍
🌈个人主页:秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343🔥 系列专栏:https://blog.csdn.net/qinjh_/category_12625432.html 目录 前言 Linux项目自动化构建工具-make/Makefile 举例 .PHONY 常见符号 依赖关系…...
C语言—关于字符串(编程实现部分函数功能)
0.前言 当我们使用这些函数功能时,可以直接调用头文件---#include<string.h>,然后直接使用就行了,本文只是手动编写实现函数的部分功能 1.strlen函数功能实现 功能说明:strlen(s)用来计算字符串s的长度,该函数计数不会包括最…...

picoCTF-Web Exploitation-Trickster
Description I found a web app that can help process images: PNG images only! 这应该是个上传漏洞了,十几年没用过了,不知道思路是不是一样的,以前的思路是通过上传漏洞想办法上传一个木马,拿到webshell,今天试试看…...

SSH 免密登录,设置好仍然需要密码登录解决方法
说明: ssh秘钥登录设置好了,但是登录的时候依然需要提供密码 查看系统安全日志,定位问题 sudo cat /var/log/auth.log或者 sudo cat /var/log/secure找到下面的信息 Authentication refused: bad ownership or modes...(网上的…...
【斑马打印机】web前端页面通过BrowserPrint API连接斑马打印机进行RFID条形码贴纸打印
web前端页面通过BrowserPrint API连接斑马打印机进行RFID条形码贴纸打印 在现代物流、仓储和零售行业中,RFID和二维码技术发挥着至关重要的作用。这些技术不仅提高了效率,还增强了追踪和管理的能力。本文将介绍如何使用JavaScript和斑马打印机的BrowserPrint API来打印RFID二…...

DigitalOcean 应用托管更新:应用端到端运行时性能大幅改进
DigitalOcean 希望可以为企业提供所需的工具和基础设施,以帮助企业客户加速云端的开发,实现业务的指数级增长。为此 DigitalOcean 在 2020 年就推出了App Platform。 App Platform(应用托管) 是一个完全托管的 PaaS 解决方案&…...
c/c++对于char*的理解(联合string容器)
在C和C中,char*是一个指向字符(char)的指针。它经常被用来处理C风格的字符串,这种字符串是以空字符(\0)结尾的字符数组。以下是关于char*的一些关键点: C风格的字符串: C风格的字符…...

Web前端三大主流框架是什么?
Web前端开发领域的三大主流框架分别是Angular、React和Vue.js。它们在Web开发领域中占据着重要的地位,各自拥有独特的特点和优势。 Angular Angular是一个由Google开发的前端框架,最初版本称为AngularJS,后来升级为Angular。它是一个完整的…...

一个基于servlet的MVC项目-登录验证
一、MVC的概念 MVC是Model、View、Controller的缩写,分别代表 Web 应用程序中的3种职责1 模型:用于存储数据以及处理用户请求的业务逻辑。 2视图:向控制器提交数据,显示模型中的数据。 3控制器:根据视图提出的请求,判断将请求和数据交给哪个…...

Windows 11 下 kafka 的安装踩坑
安装 windows系统kafka小白入门篇——下载安装,环境配置,入门代码书写(推荐) kafka在windows下安装和使用入门教程 问题1 参考链接 运行kafka集成的zookeeper时,命令:bin\windows\zookeeper-server-star…...
二维数组:行列互换/求最大值及其所在位置/求各行各列的和/矩阵乘积/深入理解二维数组
二维数组 1.定义 只有行号可以省略,初始化 全部初始化/部分初始化/不初始化 2.元素引用 3.存储形式 :顺序存储 按行存储 4.深入理解二维数组 #include<stdio.h> #include<stdlib.h>#define M 2 #define N 3int mian() {int a[M][N] {{1,2,3},{4,5,6}}…...
The Onion Router-洋葱
目录 Tor的运作原理 Tor挑战和局限性 Tor,即The Onion Router(洋葱路由器),是一个用于匿名通信的开放网络,它旨在增强用户的隐私和安全。Tor的名字源自其设计原理,类似于将信息包装在多层“洋葱”中&…...

自动化工具 Ansible:playbooks 剧本编写
目录 前言 一、playbooks 剧本概述 1、playbooks 剧本概念 2、playbooks 剧本组成部分 3、playbooks 剧本特点与优势 二、ansible-playbook 命令 三、playbooks 剧本简单实例 1、编写 apache 的 yum 安装部署脚本 2、编写 nginx 的 yum 安装部署剧本 四、playbooks 定…...

AttributeError: module ‘flask.app‘ has no attribute ‘route‘
秒解方法一: # 未引入Flask app Flask(__name__)秒解方法二: AttributeError: ‘module’ object has no attribute ‘route’错误描述: 这个错误通常发生在使用 app.route 装饰器时,表示 Flask 无法找到 route 属性。 解决方法…...

在云计算与人工智能中,7ECloud扮演着什么样的角色
数据驱动的时代,云计算和人工智能已成为推动现代科技进步的两大引擎。作为一家专注于云计算的公司,7ECloud正是在这个领域发挥自己的力量,力图为企业提供一站式解决方案,并拥有来自厂家的源头支持,用极其低的价格助力企…...

视频推拉流EasyDSS视频直播点播平台如何优先展示正在直播的直播间?
视频推拉流EasyDSS视频直播点播平台集视频直播、点播、转码、管理、录像、检索、时移回看等功能于一体,可提供音视频采集、视频推拉流、播放H.265编码视频、存储、分发等视频能力服务,在应用场景上,平台可以运用在互联网教育、在线课堂、游戏…...

JavaEE之线程(4)——线程安全、线程安全的原因,synchronized关键字
前言 在本栏的前面的内容中,我们介绍了线程的创建、Thread 类及常见方法、线程的状态,今天我们来介绍一下关于线程的另一个重点知识——线程安全。 一、线程安全 基本概念: 线程安全的确切定义是复杂的,但我们可以这样认为&…...
Python3 笔记:分支结构
Python 中选择结构:单分支选择结构、双分支选择结构、多分支选择结构。 1、if 语句是单分支选择结构,其语法形式如下: if 条件表达式: 语句块 如果条件表达式的值为真,即条件成立,语句块将被执行;否…...

《TAM》论文笔记(上)
原文链接 [2005.06803] TAM: Temporal Adaptive Module for Video Recognition (arxiv.org) 原文代码 GitHub - liu-zhy/temporal-adaptive-module: TAM: Temporal Adaptive Module for Video Recognition 原文笔记 What: TAM: Temporal Adaptive Module for …...

【Java的抽象类和接口】
1. 抽象类 1.1 抽象类概念 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果 一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。 以上代码中…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...

uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...

多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...
Qt 事件处理中 return 的深入解析
Qt 事件处理中 return 的深入解析 在 Qt 事件处理中,return 语句的使用是另一个关键概念,它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别:不同层级的事件处理 方…...