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

news2024/11/23 4:50:00

目录

背景

实例代码

依赖关系

依赖方法

原理

项目清理

可重复执行的依据


 

背景

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

实例代码

C代码
  myfile:myfile.o
    gcc -o myfile myfile.o
  myfile.o:myfile.s
    gcc -c  -o myfile.o myfile.s
  myfile.s:myfile.i
    gcc -S -o myfile.s myfile.i
  myfile.i:myfile.c
    gcc -E -o myfile.i myfile.c         
  myfile:myfile.c
      gcc -o myfile myfile.c

 

依赖关系

上面的文件
myfile ,它依赖 myfile.o
myfile.o , 它依赖 myfile.s
myfile.s , 它依赖 myfile.i
myfile.i , 它依赖 myfile.c

依赖方法

gcc myfile.* -option myfile.* ,就是与之对应的依赖关系

原理

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

项目清理

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

       

  •          clean 后指令会被执行,也可以执行echo等指令

 

         
     
  •         调换一下顺序:make 执行第一part的指令
  1 clean:
  2   rm -f myfile.i myfile.s myfile.o myfile
  3 
  4 myfile:myfile.o
  5   gcc -o myfile myfile.o                                                                                            
  6 myfile.o:myfile.s
  7   gcc -c -o myfile.o myfile.s
  8 myfile.s:myfile.i
  9   gcc -S -o myfile.s myfile.i
 10 myfile.i:myfile.c
 11   gcc -E -o myfile.i myfile.c

 

 

       但是一般我们这种clean的目标文件,我们将它设置为伪目标,用 .PHONY 修饰,伪目标的特性是, 总是被执行的 。 可以将我们的 myfile 目标文件声明成伪目标,测试一下
  •         未加.PHONY

 

  •         加了.PHONY

    1 

  1 myfile:myfile.o
  2   gcc -o myfile myfile.o
  3 myfile.o:myfile.s
  4   gcc -c -o myfile.o myfile.s
  5 myfile.s:myfile.i
  6   gcc -S -o myfile.s myfile.i
  7 myfile.i:myfile.c
  8   gcc -E -o myfile.i myfile.c
  9 
 10 
 11 .PHONY:clean
 12 clean: 
 13   rm -f myfile.i myfile.s myfile.o myfile 

 2

 

  1 .PHONY:myfile
  2 myfile:myfile.c
  3   gcc -o myfile myfile.c
  4 
  5 .PHONY:clean
  6 clean:
  7   rm -f myfile 

         一般只clean部分总是执行

可重复执行的依据

touch已存在的文件,更新其时间 

[root@VM-12-17-centos lesson7]# vim myfile.c
[root@VM-12-17-centos lesson7]# make
gcc -o myfile myfile.c
[root@VM-12-17-centos lesson7]# ll
total 20
-rw-r--r-- 1 root root  359 Jan 12 21:59 Makefile
-rwxr-xr-x 1 root root 8360 Jan 12 22:01 myfile
-rw-r--r-- 1 root root  100 Jan 12 22:01 myfile.c
[root@VM-12-17-centos lesson7]# stat myfile
  File: ‘myfile’
  Size: 8360      	Blocks: 24         IO Block: 4096   regular file
Device: fd01h/64769d	Inode: 790145      Links: 1
Access: (0755/-rwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2023-01-12 22:01:58.304080944 +0800
Modify: 2023-01-12 22:01:58.002078678 +0800
Change: 2023-01-12 22:01:58.002078678 +0800
 Birth: -
[root@VM-12-17-centos lesson7]# stat myfile.c
  File: ‘myfile.c’
  Size: 100       	Blocks: 8          IO Block: 4096   regular file
Device: fd01h/64769d	Inode: 790102      Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2023-01-12 22:01:52.357036316 +0800
Modify: 2023-01-12 22:01:52.355036301 +0800
Change: 2023-01-12 22:01:52.355036301 +0800
 Birth: -
[root@VM-12-17-centos lesson7]# touch myfile.c
[root@VM-12-17-centos lesson7]# stat myfile.c
  File: ‘myfile.c’
  Size: 100       	Blocks: 8          IO Block: 4096   regular file
Device: fd01h/64769d	Inode: 790102      Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2023-01-12 22:02:42.314411188 +0800
Modify: 2023-01-12 22:02:40.966401073 +0800
Change: 2023-01-12 22:02:40.966401073 +0800
 Birth: -

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

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

相关文章

K8s部署前后端分离项目(一)

K8s部署前后端分离项目 环境准备 K8s环境 主节点master:192.168.3.200 子节点node1:192.168.3.201 子节点node2:192.168.3.202 Harbor远程仓库 已部署在master主节点上,目录为:cd /workspace/harbor/harbor 1、登录地…

java使用XDocReport导出word

使用XDocReport 导出word效果word编辑器案例word模板模板制作解决图片不存在时, "现场照片" 列被隐藏问题依赖返回数据对象 DailyRecordReportOpinionVO 审核记录对象PicVo 图片对象导出接口效果 说明: “现场图片” 为动态图片列表 , “专业负责人审核意见” 和 “项…

freeswitch的多租户模式

概述 freeswitch是一款简单好用的VOIP开源软交换平台。 现在的VOIP服务越来越倾向于云端服务,包括呼叫中心云服务,线路云平台。 而云平台对多个客户的服务就需要做好隔离,包括数据隔离、线路隔离、服务隔离等。 freeswitch内部的多租户模…

如何给视频批量添加背景图的实例操作教程

如何给视频添加上背景图片呢?有需要的宝宝跟着小编一起来看看怎么操作的吧。 先运行【云炫AI智剪】,然后再选择画中画,切换相对应的界面当中。 接下来把底画背景图导入到列表中,可以选中文件直接拖动到软件中,或者…

多次执行相同的push、replace问题(重写push、replace)

1.多次执行相同的push、replace问题编程式导航路由跳转到当前路由(参数不变), 多次执行会抛出NavigationDuplicated的警告错误注意:编程式导航(push|replace)才会有这种情况的异常,声明式导航是没有这种问题,因为声明式导航内部已…

你是真的“C”——详解C语言函数模块知识(上篇)

详解C语言函数模块知识(上篇)😎前言🙌1. 函数是什么⁉️2、C语言中函数的分类🙌库函数:😃自定义函数😃**这里通过几个例子来辅助大家更好的理解函数如何用** ⁉️1、实现一个函数来交换两个整数…

C语言实现静态通讯录

专栏:C语言 每日一句:这几年可能会有点累,但要相信你的人生不可能就止于此地了,你要有你的梦想,所以你要努力,只有坚持这阵子,才不会辛苦一辈子,努力会让自己过得很好, 静…

Qt扫盲-QAction理论总结

QAction理论总结一、概述二、使用一、概述 在应用程序中,许多常用命令可以通过 菜单、工具栏按钮 和 键盘快捷键 调用。由于用户希望以相同的方式执行每个命令,而不管使用什么用户界面,因此将每个命令表示为一个Action操作是有效的。可以将A…

23年 车辆检测+车距检测+行人检测+车辆识别+车距预测(附yolo v5最新版源码)

我们先看一下效果2023年最新版 yolo车距行人识别yolov5和v7对比yolo车距其他步骤参考另外一篇文章: yolo 车辆测距车辆识别单目测距(双目测距)_SYBH.的博客-CSDN博客_yolo测距基于yolo目标检测算法实现的车前道路中的车辆和行人检测&#xf…

opener 值得注意的安全问题

前言 最近在学习浏览器知识的时候,讲到了浏览器之间的渲染进程共用的问题。其中 opener 能被引用到的两个页面,会在同一个渲染进程中。而这两个页面,可以称为:浏览上下文组。但在测试的时候,反倒是发现了一个opener 注…

JavaEE进阶第一课:Spring核心与设计思想

目录1.Spring是什么1.1什么是容器1.2什么是IoC1.3什么是DISpring的核心功能1.Spring是什么 用官方的话来说:Spring是包含众多工具方法的IoC容器 但是仅仅这样一句话,就会让大家有许多不解?什么是IoC?什么是容器?接下来…

python基础篇之字符串类型

大家好,我是csdn的博主:lqj_本人 这是我的个人博客主页:lqj_本人的博客_CSDN博客-微信小程序,前端,vue领域博主lqj_本人擅长微信小程序,前端,vue,等方面的知识https://blog.csdn.net/lbcyllqj?spm1000.2115.3001.5343 哔哩哔哩欢迎关注&…

Java字节流基础详解(InputStream/OutputStream)

文章目录概念InputStream字节输入流FileInputStream文件字节输入流FileOutputStream字节输出流相关的方法(write)和构造器构造器注意事项文件拷贝概念 在Java中,字节流一般适用于处理字节数据(诸如图片、视频)&#x…

Netty入门笔记(一)BIO、NIO、AIO

一.Netty简介 Netty是由JBOSS提供的一个java开源框架Netty是一个异步的,基于事件驱动的网络应用框架,用以快速开发高性能,高可靠性的网络IO程序Netty主要针对在TCP协议下,面向Client端的高并发应用,或者peer-to-peer场…

裁剪图片原理

FileReader HTML5定义了FileReader作为文件API的重要成员用于读取文件,根据W3C的定义,FileReader接口提供了读取文件的方法和包含读取结果的事件模型。 创建实例 const reader new FileReader(); 方法 事件 Blod Blob是用来支持文件操作的。简单的…

牛客每日一题(1/12)

233的字符串题目描述 读入一个正整数n,代表将字符串"abc"重复n次,形成一个长度为3n的字符串。例如n3时,形成的字符串为"abcabcabc"。请你计算该字符串中有多少个"acb"子序列。答案对10^97取模。输入描述:一个正…

【计算机网络-数据链路层】局域网(LAN)

文章目录1 局域网的概念1.1 局域网的拓扑结构1.2 局域网的传输介质1.3 局域网的介质访问控制方式(MAC)1.4 局域网的分类2 以太网(Ethernet,IEEE 802.3 标准)2.1 以太网的传输介质2.2 以太网的网卡2.3 以太网的 MAC 地址…

flutter apk 加固引发的问题

背景:Apk 加固,防止动态调试啥的,用的是 腾讯家的加固方案:应用加固,这个加固完之后 因为破壳了,所以需要重写签名;今天发现一个这样的问题:最早加固完毕安装不了提示:Failure IINST…

C语言从入门到放弃——静态通讯录实现

目录 一.功能实现 1.打印开始菜单 2.实现选择 3.初始化通讯录 4.添加、删除等功能实现 (1)添加联系人 (2)删除联系人 (3)查找联系人 (4)修改联系人 (5&#xff…

【C++】基于EasyX库的2048小游戏

文章目录0 前言1 先看一下最终的效果图2 2048核心2 EasyX库2.1 配色2.2 文字2.3 填充3 总结0 前言 最近比较迷2048小游戏,于是想自己写代码实现出来,恰好也在网上找到一个现成的2048的VS工程,但是界面做得很难看,且运行逻辑存在一…