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

[ Linux 长征路第五篇 ] make/Makefile Linux项目自动化创建工具

目录

0.Linux项目自动化构建工具 - make/Makefile

1.make和makefile是什么?

2.为什么要使用make和makefile?

3. 怎么创建makefile

3.1  编写makefile

3.1.1 依赖关系

3.1.2 依赖方法

3.2 使用make

3.2.1 make的原理

3.2.2 查看文件修改时间

3.3 编写项目清理

3.3.1 如何编写项目清理

3.3.2 clean详解 


0.Linux项目自动化构建工具 - make/Makefile

1.make和makefile是什么?

make是一个命令,makefile是一个文件

2.为什么要使用make和makefile?

首先我们仍然写一段最简单的代码来供我们参考

#include <stdio.h>
int main()
{
  printf("hello world\n");
  return 0;
}

我们在上篇文章说过,如果要编译这段C语言代码,我们可以使用

gcc test.c -o test

我们发现结果没有问题。 

 如果我们不小心误写了gcc这行指令又会发生什么呢?

 

此时我们再来查看发现源文件都被覆盖掉了

为了避免这种问题的发生,我们可以使用makefile自动化构建工具。

因此我们可以回答问什么要使用make/makefile:

1.减少出现未定义的错误

2.减少构建项目的成本

3. 怎么创建makefile

我们前面提到了makefile是一个文件,因此我们在当前路径下创建一个makefile

touch Makefile

3.1  编写makefile

 makefile:在当前路径下的一个普通文件

makefil内部包含两个东西:1.依赖关系 2.依赖方法

我们进入makefile输入

test:test.c
	gcc test.c -o test

注意:gcc要另起一行并且要先敲一个Tab键 

 

3.1.1 依赖关系

上面的文件 test ,它依赖 test.c

3.1.2 依赖方法

gcc test.c -o test 就是与之对应的依赖关系

3.2 使用make

至此我们一个最简单的makefile就写好了,现在我们只需要输入make命令就会在makefile中寻找依赖关系和依赖方法已经我们在makefile中表明的依赖方法。

 

3.2.1 make的原理

1.make会在当前目录下找名字叫做"makefile"或“Makefile”的文件。

2.如果找到,他会找文件中的第一个目标文件,在上面的例子中,他会找到"test"这个文件,并把这个文件作为最终的目标文件

3.如果test文件不存在,或是test所依赖的后面test.c文件的文件修改时间要比test这个文件新(可以用touch测试),那么他就会执行后面所定义的命令来生成test这个文件

4.这就是make的依赖性,make会一层又一层的去找文件的依赖关系,知道最终编译出第一个目标文件

5.在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make根本不理。

6.make只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在,那么对不起, 我就不工作啦。

上面第3点说到的,test所依赖的后面test,c文件的文件修改时间,以及test这个文件的修改时间,这又是什么意思呢?

其实呀,这个是非常简单的,我们举例来说!

我们写好makefile之后进行make,第一次make时会运行依赖方法,当我们不进行任何操作直接进行第二次make时,我们发现并没有执行依赖方法。而是告诉我们test目标文件已经是最新的了。这也非常的好理解,如果我们已经gcc一次之后生成了目标文件,如果我们不对源文件进行修改时,我们再次gcc时其实生成的目标文件没有进行修改,仍然是之前第一次的目标文件,因此系统就没必要再执行一次依赖方法。

而当我们对test.c进行修改时,我们再次使用make,此时我们发现执行了依赖方法,这也非常好理解,系统发现源文件被修改,gcc之后形成的目标文件肯定和之前的目标文件不同,因此会执行依赖方法。这就是上面第3点所提到的问题。

3.2.2 查看文件修改时间

 我们使用stat可以查看文件的修改时间

stat 文件名称

文件的时间有3个也叫ACM时间:

Access:读取或进入文件的时间

Modify:最后一次文件内容改变时间

Change:最后一次文件属性改变时间

假如我们改变一下源代码,我们发现修改文件的内容,Modify时间确实改变了,怎么chang time也发生了改变,这是因为修改文件内容可能会导致changtime的变化,内容变化后,属性可能会随之变化(比如文件的大小(size)).

3.3 编写项目清理

3.3.1 如何编写项目清理

.PHONY:clean
clean:
 rm -f test

此时,我们使用make clean就会对所创建的目标文件进行清理

3.3.2 clean详解 

1.工程是需要被清理的

2.像clean这种,没有被第一个目标文件直接或者间接关联,那么它后面所定义的命令将不会被自动执行,不过,我们可以显示要make执行。即命令 -- “make clean”,以此来清楚所有的目标文件,以便重编译

3.但是一般我们这种clean的目标文件,我们将设置为伪目标,用.PHONY 修饰,伪目标的特性是:总是被执行。

(本篇完)

相关文章:

  • JVM常见面试题及详解
  • 【第13题】合并两个有序链表(考察递归)
  • 计算机毕业设计django基于python精品课程在线学习系统(源码+系统+mysql数据库+Lw文档)
  • 基于springboot的海鲜特产商城
  • 安装myql
  • jvm性能调优实战 - 61常用的JVM调优网站
  • JAVA面试题——初级
  • 20 个 JS 工具函数助力高效开发
  • python珍藏宝藏学习资料
  • mysql<回表,覆盖索引,最左匹配,索引下推>
  • 基于Python的电子病历实体识别系统
  • 计算机视觉项目-人脸识别与检测
  • Nature全球潮汐可视化兼影像数据下载网站:Intertidal change
  • 每日优鲜深陷“破产风波”,生鲜电商路在何方?
  • 需求分析的基本任务 ,需求分析参与人 ,目前用于需求分析的结构化分析方法遵守的准则,确定对系统的综合要求及案例
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • Intervention/image 图片处理扩展包的安装和使用
  • Java Agent 学习笔记
  • vagrant 添加本地 box 安装 laravel homestead
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 关于Java中分层中遇到的一些问题
  • 基于遗传算法的优化问题求解
  • 将 Measurements 和 Units 应用到物理学
  • 盘点那些不知名却常用的 Git 操作
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • 线上 python http server profile 实践
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • $jQuery 重写Alert样式方法
  • (1)Nginx简介和安装教程
  • (1)STL算法之遍历容器
  • (a /b)*c的值
  • (Java数据结构)ArrayList
  • (初研) Sentence-embedding fine-tune notebook
  • (附源码)spring boot校园健康监测管理系统 毕业设计 151047
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (转)菜鸟学数据库(三)——存储过程
  • .net 4.0 A potentially dangerous Request.Form value was detected from the client 的解决方案
  • .NET Micro Framework初体验
  • .Net Web项目创建比较不错的参考文章
  • .NET/C# 使窗口永不激活(No Activate 永不获得焦点)
  • .NET企业级应用架构设计系列之技术选型
  • .net图片验证码生成、点击刷新及验证输入是否正确
  • .pop ----remove 删除
  • [【JSON2WEB】 13 基于REST2SQL 和 Amis 的 SQL 查询分析器
  • [383] 赎金信 js
  • [Android学习笔记]ScrollView的使用
  • [C++]C++基础知识概述
  • [CareerCup] 12.3 Test Move Method in a Chess Game 测试象棋游戏中的移动方法
  • [CareerCup] 14.5 Object Reflection 对象反射
  • [CF226E]Noble Knight's Path
  • [CISCN 2023 初赛]go_session