【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操作即可。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/621124.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

前端报错 SyntaxError: Unexpected number in JSON at position xxxx at JSON.parse

问题描述​ 控制台提示 SyntaxError: Unexpected number in JSON at position xxxx at JSON.parse 问题原因​ 原因&#xff1a;JSON 数据格式错误&#xff0c;是否符合 JSON 格式。 解决方法​ 应为json格式数据 什么是json格式数据 JSON&#xff08;JavaScript Object …

使用sqlmodel实现唯一性校验2,插入之前检查是否已存在

虽然之前添加唯一性校验的方法能够解决数据唯一的问题&#xff0c;但是如果忘了处理异常&#xff0c;则可能会导致程序崩溃。 在此基础上&#xff0c;我们可以在插入数据之前检查该数据是否已存在。 原来的代码&#xff1a; from sqlmodel import Field, Session, SQLModel,…

基于Python实现蔬菜水果识别

蔬菜水果识别在农业生产、食品加工和市场销售等领域具有重要意义。随着计算机视觉和机器学习技术的发展,利用图像识别技术实现蔬菜水果的自动化识别已成为可能。 目录 引言研究背景问题陈述研究目标文献综述蔬菜水果识别的相关研究概述基于计算机视觉和机器学习的图像识别方法…

【WEB前端2024】开源智体世界:乔布斯3D纪念馆-第20课-烟花插件

【WEB前端2024】开源智体世界&#xff1a;乔布斯3D纪念馆-第20课-烟花插件 使用dtns.network德塔世界&#xff08;开源的智体世界引擎&#xff09;&#xff0c;策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtns.network是一款主要由JavaScript编写的智体世界引擎&am…

光纤VS紫外:如何选择最适合您生产线的激光打标机?

光纤激光打标机和紫外激光打标机在制造业中都有其独特的应用&#xff0c;但两者在原理、特点和应用范围上存在一些差异。 光纤激光打标机是一种采用光纤输出激光&#xff0c;并通过高速扫描振镜系统实现打标功能的新一代激光打标机系统。它电光转换效率高&#xff0c;达到30%以…

鸿蒙内核源码分析(gn应用篇) | gn语法及在鸿蒙的使用

gn是什么? gn 存在的意义是为了生成 ninja,如果熟悉前端开发,二者关系很像 Sass和CSS的关系. 为什么会有gn,说是有个叫even的谷歌负责构建系统的工程师在使用传统的makefile构建chrome时觉得太麻烦,不高效,所以设计了一套更简单,更高效新的构建工具gnninja,然后就被广泛的使用…

轻松掌握RAID级别

一、官方说明&#xff1a; RAID&#xff08;英文全称 Redundant Array of Independent Disks&#xff09;翻译成中文&#xff08;独立磁盘冗余阵列&#xff09;。 RAID 是一种将多块独立磁盘&#xff0c;组成一组逻辑磁盘的技术。RAID 级别分为 0、1、3、5、6等&#xff0c;可…

【Qt 学习笔记】Qt常用控件 | 容器类控件 | Tab Widget的使用及说明

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt常用控件 | 容器类控件 | Tab Widget的使用及说明 文章编号&#xf…

健康行业CRM软件-保健行业CRM解决方案示例

Z公司面临客户信息管理和销售效率的挑战&#xff0c;提出使用ZohoCRM解决方案。ZohoCRM可集中管理客户信息、自动化销售流程并优化客户关系&#xff0c;提供数据分析和市场趋势洞察&#xff0c;帮助Z公司提升销售效率和客户满意度。 一、健康公司痛点 Z公司作为一家专注于特膳…

光数据传送器|光通讯传感器极速版OPT系列尺寸与安装步骤

光数据传送器|光通讯传感器极速版OPT系列是利用可见光及不可见光作为信息载体&#xff0c;无需光纤、网线等有线介质&#xff0c;在空中直接进行信息传输的无线方式通信。驱动光源以可见光及不可见光的高速明暗变化来传输数字信号&#xff0c;以极高光频率双向发射接收光信号&a…

CSRF漏洞原理攻击与防御

CSRF&#xff08;Cross-site request forgery&#xff09;跨站请求伪造&#xff1a;也被称为“One Click Attack”或者Session Riding&#xff0c; 通常缩写为CSRF或者XSRF&#xff0c;是一种对网站的恶意利用。尽管听起来像跨站脚本&#xff08;XSS&#xff09;&#xff0c;但…

设计模式-工厂模式设计与详解

一、设计模式介绍 设计模式是我们开发中常常需要面对的核心概念&#xff0c;它们是解决特定问题的模板或者说是经验的总结。这些模式被设计出来是为了让软件设计更加清晰、代码更加可维护且能应对未来的变化。良好的设计模式不仅能解决重复代码的问题&#xff0c;还能使团队中…

408数据结构-哈夫曼树 自学知识点整理

前置知识&#xff1a;二叉树的概念、性质与存储结构 哈夫曼树 哈夫曼树的定义 首先需要明确几个概念。 路径&#xff1a;从树中的一个结点到另一个结点之间的分支构成这两个结点之间的路径。 路径长度&#xff1a;路径上的分支数目称为路径长度。 权(值)&#xff1a;树中结点…

实时追踪维修进度,报修管理小程序让你省心又省力!

随着生活、工作节奏的日益加快&#xff0c;日常的售后报修、故障报修处理流程给我们带来种种困扰。我们都知道大多数企业、个人用户还在使用传统报修方式&#xff0c;如电话报修、纸质报修单等方式&#xff0c;不仅效率低下&#xff0c;而且难以追踪维修进度&#xff0c;给我们…

无人机+自组网:空地点对点无人机通信解决方案

随着智能化技术的迅速发展, 无人化设备在战场上发挥的作用日益突显。在近期发生的多次局部战争中, 无人设备代替人类承担了多项危险且复杂的攻击任务, 达到 “兵不血刃” 的效果. 2020 年 1 月 3 日, 美军利用无人机执行了刺杀伊朗 “圣城旅” 指挥官苏莱曼尼行动. 纳戈尔诺 - …

48.乐理基础-音符的组合方式-休止符

休止符 音乐中总有一些停顿的地方&#xff0c;一次停顿多久是创作人固定好的&#xff0c;休止符就是用来表示每一次停顿多久 需要停顿的位置就用 0 来表示&#xff0c;数字 0 就是简谱中的休止符 音符有全音符、二分音符、四分音符、八分音符、十六分音符、三十二分音符等&…

海外静态IP购买:全面解析与购买指南

在当今这个信息化、网络化的时代&#xff0c;IP地址成为了网络世界中不可或缺的一部分。随着跨国业务的不断增多&#xff0c;海外静态IP的需求也日益增长。海外静态IP&#xff0c;作为一种稳定、可靠的网络资源&#xff0c;为企业在全球范围内的业务拓展提供了强有力的支持。本…

实训八:使用jQuery技术实现企业信息展示系统的相关功能

实训八:使用jQuery技术实现企业信息展示系统的相关功能 1.题目 使用jQuery技术实现企业信息展示系统的相关功能。 2.目的 (1)掌握jQuery的基本知识。 (2)掌握jQuery的应用方法。 (3)进一步理解Ajax程序的设计方法。 (4)会利用所学知识设计简单的应用程序。 3.内容 用jQuery技术…

aws s3

列出关键点 创建s3 设置s3策略&#xff0c;所有人访问 { "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor1", "Effect": "Allow", …

Spring Boot | Spring Boot 消息管理 ( 消息中间件 ) 、RabbitMQ“消息中间件“

目录: 一、"消息服务" 概述 :1.1 为什么要使用 "消息服务" ( 消息中间件 ) &#xff1f;① 异步处理② 应用解耦③ 流量削峰④ 分布式事务管理 1.2 常用 "消息中间件" 介绍 :ActiveMQ ( 广泛应用于中小型企业 )RabbitMQ ( 没有特别要求的场景下…