【Linux取经之路】Linux项目自动化构建工具-make/makefile git三板斧

目录

关于make和makefile

一个案例

make和makefile的使用 

makefile的基本语法

git的使用


关于make和makefile

make是 Linux 系统中广泛使用的一个自动化构建工具,它根据用户定义的规则(通常保存在一个名为 makefile的文件中)来自动编译和链接程序。make 工具的主要目的是自动化编译过程,减少重复的手动操作,并确保编译过程的一致性和可重复性。make是一个解释makefile中命令的工具。一条命令(make)和一个文件(makefile),搭配使用,完成项目自动化构建。

一个案例

假设我们要执行的文件(main)里包含了3个源代码文件,分别是hello.c、world.c、test.c。为了得到可执行文件main,我们做如下的操作。

hello.c:声明Add函数。

world.c:实现Add函数。

test.c:调用Add函数。

1)得到hello.o、world.o、test.o

2)将hello.o、world.o、test.o编译成main

gcc -c hello.c -o hello.o
gcc -c world.c -o world.o
gcc -c test.c -o test.o
gcc -o main hello.o world.o test.o

编译的过程需要进行好多操作,而且如果需要重新编译呢?上述的流程在整一遍?未免太烦人了吧,如果可以的话,能不能一步就完成上面的所有操作?下面我们正式进入make和makefile。 

make和makefile的使用 

我们先在当前目录下新建一个makefile文件,文件内容如下:

第二行开头是Table键产生的空格。第一行叫做依赖关系,第二行叫做依赖方法。下面我们来使用makefile指定的规则进行编译操作。

我们在使用make的时候,它会去读取makefile的内容,并根据内容直接去给它编译相关的文件。

如果我们连续make,会怎样呢?

它会提示我们,目前main文件已经是最新了。 

现在,我们来总结一下make的好处,接着在谈makefile的基本语法。

make的好处:

        ● 简化编译时所需要执行的命令。

        ● 若在编译完成之后,修改了某个源文件的代码,则make仅会针对被修改了的文件进行编译,其他的目标文件不会被修改。

        ● 可以依照依赖性来更新执行文件。

makefile的基本语法

目标:目标文件1 目标文件2
<Tab>    gcc  -o  欲建立的执行文件  目标文件1  目标文件2  

其中,第1行叫做依赖关系。也就是说,目标执行文件的生成要依赖于目标文件1和目标文件2。第二行,注意:命令行必须以Tab键作为开头。此行叫做依赖方法。也就是指明了目标执行文件是如何依赖目标文件1和目标文件2的。下面总结makefile的基本语法:

        ● 在makefile中#表示注释。

        ● 命令行必须以<Tab>键作为开头。

        ● 目标与目标文件之间需要以 [ : ] 隔开。

下面,我们接着上面的例子,讲一讲如何执行一个命令就可以清掉所有的目标文件和执行文件。

这里,定义了一个clean,它没有依赖关系,只有依赖方法。我们来看看执行clean的效果。

执行clean时,它实际上执行的是它对应的依赖方法,确实把所有的.o文件和目标文件都删除了。但是,makefile中重复的数据是不是有点多了?下面我们借助Shell脚本来简化makefile。

我们来执行看看效果。

这是符合预期的。makefile中的OBJS就是我们定义的一个变量,我们通过这个变量来简化了makefile,下面我们看看变量的基本语法。

        ● 变量与变量内容用=隔开,同时两边可以具有空格。

        ● 在习惯上,变量最好以大写字母为主。

        ● 运用变量时,以$(变量)或${变量}使用。

介绍一个特殊变量:$@,代表当前的目标(例如上面的main)。利用这点,我们再来把makefile简化一下。

git的使用

CentOS下,安装指令:sudo yum install -y git

Ubuntu下,安装指令:sudo apt install -y git

下载Gitee上的项目到本地

命令:git clone [url]

url表示项目的链接。

下面我以我自己在Gitee上的仓库为例进行实操(当然,你也可以创建一个新的仓库进行测试)。


 


 

复制框住的命令到终端执行就可以将此仓库中的所有代码下载到本地了。我的仓库里代码较多而且很杂,请使用自己的仓库进行测试。

执行完该指令后,Gitee上的代码确实下载到了本地。


 

git的配置 

将下面框住的指令复制到终端执行即可。


 

好了,如何下载Gitee上的项目已经讲解完毕,下面进入git的三板斧,以test.c文件为例。

三板斧第一招:git add 

1)将test.c移到pchlany中。

2)git add test.c

此时,只是把test.c添加到了git的暂存区中。

介绍一个命令:git status —— 显示当前工作目录和暂存区的状态。

三板斧第二招:git commit 

三板斧第三招:git push

 

下面,我们到Gitee仓库里看看,有没有提交成功。

 可以看到,确实提交成功了。 


本文到这就结束啦~感谢您的支持! 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Maya---机械模型制作

材质效果&#xff08;4&#xff09;_哔哩哔哩_bilibili 三角面 四边面 多边面 *游戏允许出现三角面和四边面 游戏中一般是低模&#xff08;几千个面&#xff09; 动漫及影视是高模 机械由单独零件组合而成&#xff0c;需独立制作 低面模型到高面模型 卡线是为了将模型保…

UE5学习笔记22-武器瞄准和武器自动开火

0、一些疑问的记录 1.UUserWidget类和AHUD类的区别。两者都是关于界面显示的类。 实践&#xff1a; 想让界面和用户有交互使用UUserWidget&#xff0c;如果不要交互只是显示使用AHUD类&#xff0c;例如使用UUserWidget类制作开始界面&#xff0c;游戏开始&#xff0c;游戏设置&…

深度学习之图像数据集增强(Data Augmentation)

文章目录 一、 数据增强概述二、python实现传统数据增强参考文献 一、 数据增强概述 数据增强&#xff08;Data Augmentation&#xff09;是一种技术&#xff0c;通过对现有数据进行各种变换和处理来生成新的训练样本&#xff0c;从而增加数据集的多样性和数量。这些变换可以是…

C#使用TCP-S7协议读写西门子PLC(五)-测试程序

上面四篇我们进行封装连接PLC以及读写PLC内存地址表 C#使用TCP-S7协议读写西门子PLC(一)-CSDN博客 C#使用TCP-S7协议读写西门子PLC(二)-CSDN博客 C#使用TCP-S7协议读写西门子PLC(三)-CSDN博客 C#使用TCP-S7协议读写西门子PLC(四)-CSDN博客 这里我们进行测试操作 西门子PLC-…

[JAVA]介绍怎样在Java中通过字节字符流实现文件读取与写入

一&#xff0c;初识File类及其常用方法 File类是java.io包下代表与平台无关的文件和目录&#xff0c;程序中操作文件和目录&#xff0c;都可以通过File类来完成。 通过这个File对象&#xff0c;可以进行一系列与文件相关的操作&#xff0c;比如判断文件是否存在&#xff0c;获…

floodfill+DFS(2)

文章目录 太平洋大西洋流水问题扫雷游戏迷路的机器人 太平洋大西洋流水问题 class Solution { public:vector<vector<int>> res;int m 0, n 0;vector<vector<int>> pacificAtlantic(vector<vector<int>>& heights) {m heights.size…

珠宝首饰检测系统源码分享

珠宝首饰检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

在 Python 中使用 JSON

了解如何在 Python 中使用 JSON&#xff0c;从基础到高级技术。本指南涵盖解析、序列化、API 集成和最佳实践。 1. JSON 简介 1.1. 什么是 JSON&#xff1f; JSON&#xff08;JavaScript 对象表示法&#xff09;是一种轻量级数据交换格式&#xff0c;人类可以轻松读取和写入…

mongoDB-1

文章目录 一、疑似坑1.11.2 mongo ops manager1.3 mongo features视图固定大小集合&#xff08;有点类似ringbuffer数据结构&#xff0c;capped collections&#xff09;(聚簇集合)clustered collection(类比到Mysql的聚簇索引)聚合管道 aggregation pipelineWiredTiger (默认存…

uniapp微信小程序用户授权方法

效果 步骤 1&#xff09;div标签 <button type"primary" class"btn-login" click"getUserInfo">一键登录</button>2&#xff09;js方法 methods: {getUserInfo() {console.log("aaaa")uni.getUserProfile({desc: Wexin, …

iPhone 上丢失了重要的联系人?如何恢复已删除的 iPhone 联系人

丢失 iPhone 上的联系人可能会带来灾难。无论是一份很棒的新工作机会、潜在的恋爱对象&#xff0c;还是您一直想打电话的老朋友&#xff0c;如果您打开“联系人”应用时看到空白&#xff0c;这绝不是好事。不过&#xff0c;一切并非全无&#xff0c;仍然可以通过备份或专业软件…

Mamba对UNet王炸升级!全新混合架构参数小了116倍,精度依旧完成超车

UNet又升级了&#xff01;北大最新提出LightM-UNet&#xff0c;用Mamba设计1.8M参数UNet&#xff0c;比nnU-Net小了116倍&#xff0c;计算量减少21倍&#xff0c;精度依然SOTA&#xff01; 这种将Mamba与UNet结合的策略利用了两者在图像处理和网络架构上的优势&#xff0c;既能…

Renesas R7FA8D1BH (Cortex®-M85)控制SHT20

目录 概述 1 硬件接口介绍 2 SHT20模块 2.1 SHT20简介 2.2 SHT-20模块电路 3 I2C接口实现 3.1 FSP配置I2C 3.2 I2C驱动程序实现 4 SHT20驱动程序 4.1 SHT20驱动代码结构 4.2 源代码文件 5 测试 5.1 测试功能介绍 5.2 测试代码实现 5.3 运行代码 概述 本文主要介…

持续集成与持续交付CI/CD

CI/CD 是指持续集成&#xff08;Continuous Integration&#xff09;和持续部署&#xff08;Continuous Deployment&#xff09;或持续交付&#xff08;Continuous Delivery&#xff09; 持续集成&#xff08;Continuous Integration&#xff09; 持续集成是一种软件开发实践&…

BFS 解决边权为1的最短路问题

边权为1的最短路问题 最短路问题&#xff1a; 比如说从D->K&#xff0c;找出最短的那条&#xff0c;其中每条路都是有权值&#xff0c;此篇主要讲解的边权为1的最短路问题。 即边权都是一样的。 解法就是从起点开始&#xff0c;做一次BFS&#xff1a; 需要一个队列、一个…

Spring-IOC容器-ApplicationContext

IOC:Inversion of Control 控制反转&#xff0c;是一种设计原则&#xff0c;spring 中通过DI&#xff08;dependency Injection&#xff09;来具体实现。 比如原本对象的实例化&#xff0c;是通过程序主动New出来&#xff0c;IOC中的对象实例交给Spring框架来实例化&#xff0…

后台数据管理系统 - 项目架构设计-Vue3+axios+Element-plus(0917)

七、引入 element-ui 组件库 官方文档&#xff1a; https://element-plus.org/zh-CN/ 安装 $ pnpm add element-plus自动按需&#xff1a; 安装插件 pnpm add -D unplugin-vue-components unplugin-auto-import然后把下列代码插入到你的 Vite 或 Webpack 的配置文件中 ..…

maxcompute使用篇

文章目录 maxcompute使用篇1.mongoDB与maxcompute 进行数据同步1.1 基本类型的数据1.2部分复杂类型的数据 2.maxcompute中复杂数据类型解析2.1 get_json_object2.2 json_tuple2.3 处理json几种失效的情况:2.4 STR_TO_MAP、MAP_KEYS2.5 regexp_replace2.6 FROM_JSON2.7 nvl2.8 t…

【Hot100】LeetCode—51. N 皇后

目录 1- 思路题目识别回溯 2- 实现⭐51. N 皇后——题解思路 3- ACM 实现 原题链接&#xff1a;51. N 皇后 1- 思路 题目识别 识别1 &#xff1a;给定一个整数 n &#xff0c;求解如何放置棋子的问题。 回溯 回溯三部曲 1- 回溯参数和返回值 传参 cheeseBoard、n、row 传递…

C语言:刷题日志(1)

一.阶乘计算升级版 本题要求实现一个打印非负整数阶乘的函数。 其中n是用户传入的参数&#xff0c;其值不超过1000。如果n是非负整数&#xff0c;则该函数必须在一行中打印出n!的值&#xff0c;否则打印“Invalid input”。 首先&#xff0c;知道阶乘是所有小于及等于该数的…