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

news2024/9/20 19:13:07

目录

关于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.coloradmin.cn/o/2140437.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TikTok商家如何通过真人测评提高流量和销量?

在当今的社交媒体营销领域&#xff0c;TikTok&#xff08;抖音国际版&#xff09;以其独特的短视频内容和庞大的用户群体&#xff0c;成为了品牌营销和产品推广的热门平台。其中&#xff0c;真人测评作为一种有效的营销策略&#xff0c;正逐渐受到商家的青睐。本文将探讨TikTok…

医学数据分析实训 项目三 关联规则分析作业--在线购物车分析--痹症方剂用药规律分析

文章目录 项目三 关联规则分析一、实践目的二、实践平台三、实践内容任务一&#xff1a;在线购物车分析&#xff08;一&#xff09;数据读入&#xff08;二&#xff09;数据理解&#xff08;三&#xff09;数据预处理&#xff08;四&#xff09;生成频繁项集&#xff08;五&…

常见算法——自相关的含义及Python、C实现

常见算法——自相关的含义及C实现 一、概念1. 自相关概念2. 滞后期示例说明&#xff1a; 二、自相关的计算步骤&#xff1a;1. 确定滞后期 (Lag)&#xff1a;2. 计算平均值&#xff1a;3. 计算自相关&#xff1a; 三、示例 Python自相关计算1. 代码2. 运行结果 四、C语言实现自…

yjs06——numpy的介绍与优势(1)

1.numpy是什么&#xff1f; numpy是python的一个科学计算库&#xff0c;用于快速处理 任意维度的数据&#xff1b; numpy的存储单元/基本数据类型是 ndarray&#xff08;多维数组&#xff09; 2.多维数组的建立&#xff1a; import numpy as np np.array([ [1,2,3], [4,5,6…

C++ | Leetcode C++题解之第406题根据身高重建队列

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {sort(people.begin(), people.end(), [](const vector<int>& u, const vector<int>& v) …

IV 无规矩不成方圆,区块链的“规矩”是怎么起作用的?

大家好啊&#xff0c;我是豆小匠。 通过前面几期&#xff0c;我们知道区块链是一种非中心化的解决方案&#xff0c;没有“中央处理器”。 那么&#xff0c;区块链中的各种操作&#xff0c;比如转账、状态记录等规则是怎么定义&#xff0c;又是怎么起作用的呢&#xff1f; 本…

QT--connect的使用

在qt里面我们可以用connect将信号与槽函数连接器起来&#xff0c;而connect是一个常用的函数&#xff0c;用法也非常简单。 来看一个非常简单的栗子 Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);qpbnew QPushButton(this)…

go语言中的数组指针和指针数组的区别详解

1.介绍 大家知道C语言之所以强大&#xff0c;就是因为c语言支持指针&#xff0c;而且权限特别大&#xff0c;c语言可以对计算机中任何内存的指针进行操作&#xff0c;这样自然而然也会带来一些不安全的因素&#xff0c;所以在golang中&#xff0c;「取消了对指针的一些偏移&…

清理Go/Rust编译时产生的缓存

Go Mac 1T的磁盘频频空间高级&#xff0c;发现是/Users/yourname/Library/Caches/go-build 目录占用了大量空间。 此目录保存来自 Go 构建系统的缓存构建工件。 如果目录太大&#xff0c;请运行go clean -cache。 运行go clean -fuzzcache以删除模糊缓存。 当时直接手工清理了…

C++——多线程编程(从入门到放弃)

进程&#xff1a;运行中的程序 线程&#xff1a;进程中的进程 线程的最大数量取决于CPU的核心数 一、将两个函数添加到不同线程中 demo&#xff1a;两个函数test01()和test02()&#xff0c;实现将用户输入的参数进行打印输出1000次 将这两个函数均放到独立的线程t1和t2中&…

STM32 的 CAN 通讯全攻略

目录 一、CAN 通讯概述 二、 CAN 通讯原理 1.ISO11898 标准下的物理层特征 2.CAN 协议的帧类型 3. 总线仲裁介绍 4.位时序 5.STM32 CAN 控制器简介 6.标识符筛选器 三、软件设计 1.发送流程 1.1初始化 CAN 控制器 1.2准备发送数据 1.3 将数据填充到发送缓冲区 1.4…

初始c++的继承

概念&#xff1a; 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保持原有类特性的基础上进行扩展&#xff0c;增加功能&#xff0c;这样产生新的类&#xff0c;称派生类。继承呈现了面向对象程序设计的层次结构&#xff0c…

Java高级Day43-类加载

117.类加载 静态和动态加载 反射机制是java实现动态语言的关键&#xff0c;也就是通过反射实现类动态加载 静态加载&#xff1a;编译时加载相关的类&#xff0c;如果没有则报错&#xff0c;依赖性太强 动态加载&#xff1a;运行时加载需要的类&#xff0c;如果运行时不用该类…

集群聊天服务器项目【C++】(五)网络模块和业务模块

经过前面介绍相关的库和工具&#xff0c;比如Json、CMake、muduo等&#xff0c;我们可以开始编写本项目的代码了。 1.项目目录创建 一般一个项目由以下结构组成&#xff1a; bin文件夹存放&#xff1a;可执行程序build文件夹存放&#xff1a;编译过程中的临时文件include文…

消失的数去哪里了

大家好&#xff0c;我是大圣&#xff0c;最近消失了很长一段时间了&#xff0c;之前答应粉丝要更新的文章也没有按时更新。其实我这段时间去闭关修炼去了&#xff0c;现在满血归来啦&#xff0c;之前答应粉丝的文章都会陆续发出来的。 消失的 Count 去哪了 今天给大家分享一个…

BolckingQueue

队列 队列的特点先进先出&#xff08;FIFO&#xff09;。 如图&#xff1a; 进入队列的顺序是1&#xff0c;2&#xff0c;3&#xff0c;那么出队列的顺序只能是1&#xff0c;2&#xff0c;3&#xff0c;不可能是其他顺序&#xff0c;这是由队列的特点保证的。 保存数据的基本…

彻底理解浅拷贝和深拷贝

目录 浅拷贝实现 深拷贝实现自己手写 浅拷贝 浅拷贝是指创建一个新对象&#xff0c;这个对象具有原对象属性的精确副本 基本数据类型&#xff08;如字符串、数字等&#xff09;&#xff0c;在浅拷贝过程中它们是通过值传递的&#xff0c;而不是引用传递&#xff0c;修改值并不…

基于yolov8的茶叶病害检测系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv8的茶叶病害检测系统&#xff0c;是利用深度学习技术&#xff0c;特别是YOLOv8这一先进的目标检测算法&#xff0c;来精准识别和监测茶叶生长过程中出现的各种病害。该系统通过无人机、地面机器人或固定摄像头等设备&#xff0c;定期采集茶园的高分辨率…

力扣刷题(6)

两数之和 II - 输入有序数组 两数之和 II - 输入有序数组-力扣 思路&#xff1a; 因为该数组是非递减顺序排列&#xff0c;因此可以设两个左右下标当左右下标的数相加大于target时&#xff0c;则表示右下标的数字过大&#xff0c;因此将右下标 - -当左右下标的数相加小于targ…

??Ansible——ad-hoc

文章目录 一、ad-hoc介绍二、ad-hoc的使用1、语法2、ad-hoc常用模块1&#xff09;shell模块2&#xff09;command模块3&#xff09;script模块4&#xff09;file模块5&#xff09;copy模块6&#xff09;yum模块7&#xff09;yum-repository模块8&#xff09;service模块9&#…