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

【Linux】自动化构建工具make/Makefile和git介绍

   🌈个人主页:秦jh__https://blog.csdn.net/qinjh_?spm=1010.2135.3001.5343
🔥 系列专栏:https://blog.csdn.net/qinjh_/category_12625432.html

9efbcbc3d25747719da38c01b3fa9b4f.gif

目录

前言

 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指令原本只会执行第一对依赖关系,但是上面例子却把后面的几对依赖关系都执行了。

原理:

  1. make会在当前目录下找名字叫“Makefile”或“makefile”的文件。
  2. 如果找到,它会找文件中的第一个目标文件,并把这个文件作为最终的目标文件。
  3. 如果该文件不存在,他就会执行后面所定义的命令来生成这个文件。
  4. 如果所依赖的code.o文件不存在,那么make会在当前文件中找目标为code.o文件的依赖性,如果找到则再根据那一个规则生成code.o文件。(这有点像一个堆栈的过程)
  5. 然后再用 code.o 文件声明 make的终极任务,也就是执行文件cod.exe了。
  • make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。
  • 在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错, 而对于所定义的命令的错误,或是编译不成功,make根本不理。

上面除了第一对依赖关系不能改变位置,因为他是终极任务,后面几对依赖关系的顺序可以随便换。

 Linux第一个小程序-进度条

缓冲区

运行可执行程序后,发现打印完成后,会停留3秒然后才显示下一个命令行。 

当我们把’\n"去掉后,发现运行时,会先停留3秒,然后才会打印。 这是因为此时要打印的内容都在缓冲区里面。程序结束的时候,一般会自动冲刷缓冲区。

 

 如果把"\n"放到中间,就会先打印包括\n的前面的内容,休眠3秒后再打印后面的内容。

冲刷缓冲区有三种方法:

  1. \n
  2. 缓冲区满了
  3. 强制刷新: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介绍

&#x1f308;个人主页&#xff1a;秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343&#x1f525; 系列专栏&#xff1a;https://blog.csdn.net/qinjh_/category_12625432.html 目录 前言 Linux项目自动化构建工具-make/Makefile 举例 .PHONY 常见符号 依赖关系…...

C语言—关于字符串(编程实现部分函数功能)

0.前言 当我们使用这些函数功能时&#xff0c;可以直接调用头文件---#include<string.h>&#xff0c;然后直接使用就行了,本文只是手动编写实现函数的部分功能 1.strlen函数功能实现 功能说明&#xff1a;strlen(s)用来计算字符串s的长度&#xff0c;该函数计数不会包括最…...

picoCTF-Web Exploitation-Trickster

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

SSH 免密登录,设置好仍然需要密码登录解决方法

说明&#xff1a; ssh秘钥登录设置好了&#xff0c;但是登录的时候依然需要提供密码 查看系统安全日志&#xff0c;定位问题 sudo cat /var/log/auth.log或者 sudo cat /var/log/secure找到下面的信息 Authentication refused: bad ownership or modes...&#xff08;网上的…...

【斑马打印机】web前端页面通过BrowserPrint API连接斑马打印机进行RFID条形码贴纸打印

web前端页面通过BrowserPrint API连接斑马打印机进行RFID条形码贴纸打印 在现代物流、仓储和零售行业中,RFID和二维码技术发挥着至关重要的作用。这些技术不仅提高了效率,还增强了追踪和管理的能力。本文将介绍如何使用JavaScript和斑马打印机的BrowserPrint API来打印RFID二…...

DigitalOcean 应用托管更新:应用端到端运行时性能大幅改进

DigitalOcean 希望可以为企业提供所需的工具和基础设施&#xff0c;以帮助企业客户加速云端的开发&#xff0c;实现业务的指数级增长。为此 DigitalOcean 在 2020 年就推出了App Platform。 App Platform&#xff08;应用托管&#xff09; 是一个完全托管的 PaaS 解决方案&…...

c/c++对于char*的理解(联合string容器)

在C和C中&#xff0c;char*是一个指向字符&#xff08;char&#xff09;的指针。它经常被用来处理C风格的字符串&#xff0c;这种字符串是以空字符&#xff08;\0&#xff09;结尾的字符数组。以下是关于char*的一些关键点&#xff1a; C风格的字符串&#xff1a; C风格的字符…...

Web前端三大主流框架是什么?

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

一个基于servlet的MVC项目-登录验证

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

Windows 11 下 kafka 的安装踩坑

安装 windows系统kafka小白入门篇——下载安装&#xff0c;环境配置&#xff0c;入门代码书写&#xff08;推荐&#xff09; kafka在windows下安装和使用入门教程 问题1 参考链接 运行kafka集成的zookeeper时&#xff0c;命令&#xff1a;bin\windows\zookeeper-server-star…...

二维数组:行列互换/求最大值及其所在位置/求各行各列的和/矩阵乘积/深入理解二维数组

二维数组 1.定义 只有行号可以省略&#xff0c;初始化 全部初始化/部分初始化/不初始化 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&#xff0c;即The Onion Router&#xff08;洋葱路由器&#xff09;&#xff0c;是一个用于匿名通信的开放网络&#xff0c;它旨在增强用户的隐私和安全。Tor的名字源自其设计原理&#xff0c;类似于将信息包装在多层“洋葱”中&…...

自动化工具 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‘

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

在云计算与人工智能中,7ECloud扮演着什么样的角色

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

视频推拉流EasyDSS视频直播点播平台如何优先展示正在直播的直播间?

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

JavaEE之线程(4)——线程安全、线程安全的原因,synchronized关键字

前言 在本栏的前面的内容中&#xff0c;我们介绍了线程的创建、Thread 类及常见方法、线程的状态&#xff0c;今天我们来介绍一下关于线程的另一个重点知识——线程安全。 一、线程安全 基本概念&#xff1a; 线程安全的确切定义是复杂的&#xff0c;但我们可以这样认为&…...

Python3 笔记:分支结构

Python 中选择结构&#xff1a;单分支选择结构、双分支选择结构、多分支选择结构。 1、if 语句是单分支选择结构&#xff0c;其语法形式如下&#xff1a; if 条件表达式: 语句块 如果条件表达式的值为真&#xff0c;即条件成立&#xff0c;语句块将被执行&#xff1b;否…...

《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&#xff1a; TAM: Temporal Adaptive Module for …...

【Java的抽象类和接口】

1. 抽象类 1.1 抽象类概念 在面向对象的概念中&#xff0c;所有的对象都是通过类来描绘的&#xff0c;但是反过来&#xff0c;并不是所有的类都是用来描绘对象的&#xff0c;如果 一个类中没有包含足够的信息来描绘一个具体的对象&#xff0c;这样的类就是抽象类。 以上代码中…...

synchronized 学习

学习源&#xff1a; https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖&#xff0c;也要考虑性能问题&#xff08;场景&#xff09; 2.常见面试问题&#xff1a; sync出…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

Docker 本地安装 mysql 数据库

Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker &#xff1b;并安装。 基础操作不再赘述。 打开 macOS 终端&#xff0c;开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解

在 C/C 编程的编译和链接过程中&#xff0c;附加包含目录、附加库目录和附加依赖项是三个至关重要的设置&#xff0c;它们相互配合&#xff0c;确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中&#xff0c;这些概念容易让人混淆&#xff0c;但深入理解它们的作用和联…...

MySQL 8.0 事务全面讲解

以下是一个结合两次回答的 MySQL 8.0 事务全面讲解&#xff0c;涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容&#xff0c;并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念&#xff08;ACID&#xff09; 事务是…...

怎么让Comfyui导出的图像不包含工作流信息,

为了数据安全&#xff0c;让Comfyui导出的图像不包含工作流信息&#xff0c;导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo&#xff08;推荐&#xff09;​​ 在 save_images 方法中&#xff0c;​​删除或注释掉所有与 metadata …...

MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)

macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 &#x1f37a; 最新版brew安装慢到怀疑人生&#xff1f;别怕&#xff0c;教你轻松起飞&#xff01; 最近Homebrew更新至最新版&#xff0c;每次执行 brew 命令时都会自动从官方地址 https://formulae.…...

Linux部署私有文件管理系统MinIO

最近需要用到一个文件管理服务&#xff0c;但是又不想花钱&#xff0c;所以就想着自己搭建一个&#xff0c;刚好我们用的一个开源框架已经集成了MinIO&#xff0c;所以就选了这个 我这边对文件服务性能要求不是太高&#xff0c;单机版就可以 安装非常简单&#xff0c;几个命令就…...

归并排序:分治思想的高效排序

目录 基本原理 流程图解 实现方法 递归实现 非递归实现 演示过程 时间复杂度 基本原理 归并排序(Merge Sort)是一种基于分治思想的排序算法&#xff0c;由约翰冯诺伊曼在1945年提出。其核心思想包括&#xff1a; 分割(Divide)&#xff1a;将待排序数组递归地分成两个子…...

医疗AI模型可解释性编程研究:基于SHAP、LIME与Anchor

1 医疗树模型与可解释人工智能基础 医疗领域的人工智能应用正迅速从理论研究转向临床实践,在这一过程中,模型可解释性已成为确保AI系统被医疗专业人员接受和信任的关键因素。基于树模型的集成算法(如RandomForest、XGBoost、LightGBM)因其卓越的预测性能和相对良好的解释性…...