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

【Linux】项目的自动化构建-make/makefile

💣1.背景

会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的 规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂 的功能操作 makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编 译,极大的提高了软件开发的效率。 make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命 令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一 种在工程方面的编译方法。 make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。

💣2.原理

1.makefile存在的意义,是为了构建项目,就需要准备好依赖关系和依赖方法
2. make会在当前目录下找名字叫“Makefile”或“makefile”的文件。 3. 如果找到,它会找文件中的第一个目标文件(target),在下面的例子中,他会找到“test”这个文件, 并把这个文件作为最终的目标文件。 4. 如果test文件不存在,或是test所依赖的后面的test.o文件的文件修改时间要比test这个文件新(可 以用 touch 测试),那么,他就会执行后面所定义的命令来生成test这个文件。 5. 如果test所依赖的test.o文件不存在,那么make会在当前文件中找目标为test.o文件的依赖性,如果 找到则再根据那一个规则生成test.o文件。(这有点像一个堆栈的过程) 6. 当然,你的C文件和H文件是存在的啦,于是make会生成 test.o 文件,然后再用 test.o 文件声明 make的终极任务,也就是执行文件test了。 7. 这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文 件。 8. 在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错, 而对于所定义的命令的错误,或是编译不成功,make根本不理。 9. make只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在,那么对不起, 我就不工作啦。

💣3.实例

💥4.1.依赖关系和方法

依赖关系 : 上面的文件 test ,它依赖 test.o test.o , 它依赖 test.s test.s , 它依赖 test.i test.i , 它依赖 test.c 依赖方法 gcc test就是与之对应的依赖关系

💥4.2.简单演示

指令touch makefile(Makefile)
vim编辑,写入依赖关系和依赖方法。
直接make指令就可以自动 通过makefile文件中的依赖关系和依赖方法进行构建项目
也可以清理指定文件:
马克默认执行第一个目标,make clean 就是执行clean。
.PHONY的解释:它修饰的伪目标总是被执行。其他啥都不管。

💥4.3.为什么普通目标知道自己是否被修改?

这就关系到文件的几个相关时间了。
指令:stat [文件名称]
通过比较两个文件(test和test.c)的内容修改时间(modify)来确认是否需要重新编译。
touch可以修改文件的时间到当前时间
touch 可以和 make配合使用。
所以.PHONY就是不要对比时间直接执行。不遵守这个规则。

💣4.Linux第一个小项目

先了解一下缓冲区的概念:

写一个进度条
源码:
#include <unistd.h>
#include <string.h>
int main()
{int i = 0;char bar[102];memset(bar, 0 ,sizeof(bar));const char *lable="|/-\\";while(i <= 100 ){printf("[%-100s][%d%%][%c]\r", bar, i, lable[i%4]);fflush(stdout);bar[i++] = '#';usleep(10000);}printf("\n");return 0;
}
http://www.lryc.cn/news/24194.html

相关文章:

  • 【Redis学习2】Redis常用数据结构与应用场景
  • 踩了大坑:https 证书访问错乱
  • 大数据技术之Hive(四)分区表和分桶表、文件格式和压缩
  • 环形缓冲区(c语言)
  • 创建自助服务知识库的指南
  • 分层测试(1)分层测试是什么?【必备】
  • 开源ZYNQ AD9361软件无线电平台
  • 第四阶段-12关于Spring Security框架,RBAC,密码加密原则
  • JPA——Date拓展之Calendar
  • 一文吃透 Spring 中的 AOP 编程
  • Apple主推的智能家居是什么、怎么用?一篇文章带你从零完全入门 HomeKit
  • SpringCloud系列知识快速复习 -- part 1(SpringCloud基础知识,Docker,RabbitMQ)
  • 2023上半年北京/上海/广州/深圳NPDP产品经理认证报名
  • 面试半年,总结了1000道2023年Java架构师岗面试题
  • 通过MySQL驱动拦截器实现执行sql耗时计算
  • 易基因|独家分享:高通量测序后的下游实验验证方法——DNA甲基化篇
  • java基础系列(七) 同步和异步理解
  • 吉林大学 程序设计基础 2022级 OJ期末考试 2.23
  • 【项目实战】SpringMVC拦截器实战 - 自定义拦截器防止重复提交
  • C++ STL:容器 Container
  • urllib之urlopen和urlretrieve的headers传入以及parse、urlparse、urlsplit的使用
  • 【C++】二叉搜索树的模拟实现
  • HNU工训中心:元器件及测量基础实验报告
  • 博客系统--自动化测试
  • Day903.自增主键不能保证连续递增 -MySQL实战
  • 02-MyBatis查询-
  • 外盘国际期货招商:2023年3月关注日历,把握重要投资机会
  • Linux学习(9.1)文件系统的简单操作
  • Hadoop综合案例 - 聊天软件数据
  • Python进阶-----面向对象1.0(对象和类的介绍、定义)