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

       背景

        会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力

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

        原理

         make是如何工作的,在默认的方式下,也就是我们只输入make命令。那么,

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

        make 和 makefile 形成目标文件的时候,默认是从上到下扫描makefile文件的,默认形成的是第一个目标文件。默认之形成一个。

        下面我们写一个makefile文件:

        通俗的可以解释为mybin 的形成依赖 mytest.c 第二行是解释通过什么方法形成的。

        这一段通过make clean 调用。clean的形成并没有依赖的对象,后面也可以不写。 

        如果将clean 这段代码放到 mybin前面 ,那么make一下所执行的就是clean ,make mybin 才是生成可执行程序。

        

        通过以上的程序我们不难发现多次make之后 make命令便不再会执行了,这是为什么呢?这时我们要引入一个文件时间的概念。

        通过stat mybin 这个命令

        我们可以发现文件有access modify change 三个时间,分别问文件访问时间,文件更改时间,文件属性变化的时间。

        其中modify 的改变会影响 change 。反之则不会。

        通过向文件写入内容发现modify 和其他的两个都改变。

        文件属性改变,只影响change 并不影响其他。

        

        那么make 命令是对比那个时间来判断是否执行呢?当然是modify 通过对比它和 .obj 文件生成的时间来判断是都要重新执行make,也就是说只有modify的时间比 .obj 文件时间晚,那么就要生成文件了。

        补充语法 .PHONY:clean  .PHONY修饰clean,成为一个伪代码,使clean总是被执行,使得clean的执行不考虑 文件的时间问题!!!!

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

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

相关文章

【装包拆包----泛型】

文章目录 装箱和拆箱泛型创建一个泛型数组泛型的上界泛型方法 装箱和拆箱 装箱: 把基本数据类型给到引用数据类型 public static void main(String[] args) {//自动装包//第一种装包Integer c 12;//第二种装包int a 7;Integer b a;//显示装包Integer aa Intege…

thinkphp8 数据库的连接

账号:root 密码:自己设置 http://localhost:888/index.php当出现这个并且能登陆就算成功了。 回到项目config/database.php .env 里面(如果已经.example.env 改成了.env,则改下边,db_name改成你的数据库表名) 多个…

【轨道机器人】实现Windows与下位机串口通信(未完成)

方案一:QT,编写类似串口调试助手的APP,连接上硬件,qt有个好像是串口缓存函数,可以防止占用CPU。(缺点qt估计要时间学) 方案二:利用vscode、C,编写一个可执行exe文件&…

JAVA G1垃圾收集器介绍

为解决CMS算法产生空间碎片和其它一系列的问题缺陷,HotSpot提供了另外一种垃圾回收策略,G1(Garbage First)算法,通过参数-XX:UseG1GC来启用,该算法在JDK 7u4版本被正式推出,官网对此描述如下&am…

2023年【北京市安全员-B证】试题及解析及北京市安全员-B证证考试

题库来源:安全生产模拟考试一点通公众号小程序 北京市安全员-B证试题及解析根据新北京市安全员-B证考试大纲要求,安全生产模拟考试一点通将北京市安全员-B证模拟考试试题进行汇编,组成一套北京市安全员-B证全真模拟考试试题,学员…

QT中的鼠标事件

鼠标追踪打开后进去一动就显示

Datawhale智能汽车AI挑战赛

1.赛题解析 赛题地址:https://tianchi.aliyun.com/competition/entrance/532155 任务: 输入:元宇宙仿真平台生成的前视摄像头虚拟视频数据(8-10秒左右);输出:对视频中的信息进行综合理解&…

新版软考高项试题分析精选(二)

请点击↑关注、收藏,本博客免费为你获取精彩知识分享!有惊喜哟!! 1、除了测试程序之外,黑盒测试还适用于测试( )阶段的软件文档。 A.编码 B.总体设计 D.数据库设计 C.软件需求分析 答案&a…

投入式无线液位传感器说明书

1 概述 DAQ-GP-TLL4G无线液位传感器终端是上海数采物联网科技有限公司推出的一款无线液体水位测量产品。原理是利用扩散硅片上的一个惠斯通电桥,被测介质(气体或液体)施压使桥壁电阻值发生变化(压阻效应),产…

kubernetes集群编排——istio

官网:https://istio.io/latest/zh/about/service-mesh/ 部署 [rootk8s2 ~]# tar zxf istio-1.19.3-linux-amd64.tar.gz [rootk8s2 ~]# cd istio-1.19.3/[rootk8s2 istio-1.19.3]# export PATH$PWD/bin:$PATH demo专为测试准备的功能集合 [rootk8s2 istio-1.19.3]# i…

Linux 小程序-进度条

1.进度条准备知识 1.1回车与换行 以前的键盘会有一个这样的按键 ,这个键就是回车与换行。 回车:从当前行回退到当前行的起始位置。 换行:从当前行切换到下一行的该位置。 有了以上的认识我们可以写出一个简单的倒计时代码: 注意&a…

2023.11.15-hivesql之炸裂函数explode练习

把一个容器的多个数据炸裂出单独展示: explode(容器) 需求:将NBA总冠军球队数据使用explode进行拆分&#xff0c;并且根据夺冠年份进行倒序排序。 1.建表 --step1:建表 create table the_nba_championship(team_name string,champion_year array<string> ) row format…