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

news2025/2/23 23:29:05

1.背景

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

2.实例代码

  1. 首先在Linux下创建两个文件,一个用来完成代码的编写,另一个是makefile(也可以是大写的Makefile)。
    在这里插入图片描述

  2. 在mycode.c中简单的编写一个hello world的代码
    在这里插入图片描述

  3. 在makefile编写依赖关系,和依赖方法
    在这里插入图片描述
    说明:makefile中的第一行表明依赖关系:mycode的可执行程序依赖mycode.c;第二行表明依赖方法:用gcc进行编译mycode.c生成mycode。后面三行是进行项目清理,下面会有介绍,现在可以忽略。

  4. 之后我们编译代码就再也不用用gcc mycode.c这样的指令,而是可以直接make,可执行程序mycode就会生成了。
    在这里插入图片描述

  5. 当然我们也可以运行这个可执行程序
    在这里插入图片描述

  6. 如果我们不想要mycode可执行程序,在命令行直接输入make clean即可。
    在这里插入图片描述
    注意: 通过make/Makefile管理的方式,就是Linux下的自动化构建工具。

3.三个时间

3.1 三个时间的引入

通过上述例子,细心的同志就会发现如果你连续make生成可执行程序,就会生成一个报错mycode is up to date(mycode 是最新生成的),那么Linux是如何判断mycode是不是最新的呢?
在这里插入图片描述
毫无疑问,通过比较两个时间,mycode和mycode.c时间,那怎么查看文件的时间呢?stat + 文件名 用来查看时间。
在这里插入图片描述
这里通过比较两个文件Modify时间(后文具体介绍三个时间),来判断是否需要生成最新的mycode可执行程序
在这里插入图片描述
这里发现mycode的Modefy时间比mycode.c的文件新,所以不需要生成最新的可执行程序mycode,所以报错mycode is up to date也不难理解了。

3.2 三个时间的具体介绍

3.2.1 Access访问时间

Access是最近访问文件的时间,但是由于用户访问文件的次数过多,而且用户对Access的时间需求不大。所以Linux系统优化了这Access的访问时间。可能是访问一定次数更改一次,也可能间隔一定的时间。如果需要准确了解,可能需要源码剖析,有兴趣的同志自行研究。

在这里插入图片描述
这里cat访问文件之后,Access的时间并没有进行修改。

3.2.2 Change文件属性修改时间

这个就很好理解了,当文件属性属性修改的时候,Change的时间也会修改。

在这里插入图片描述

3.2.3 Modify文件内容修改时间

举例:把mycode.c中的printf赋值三遍
在这里插入图片描述
比较两个Modify时间
在这里插入图片描述
毫无疑问,modify的时间变了,但这里其实还有一个问题:
问:为什么在Change的时间也更新的呢?
答:当文件的大小发生改变,那大小算不算文件属性的一部分呢?

4.makefile的推导规则

我们在Makefile中编写这样的依赖关系和依赖方法
在这里插入图片描述
makefile的推导规则类似于stack结构,先进后出。
mycode 依赖于mycode.o
mycode.o 依赖于 mycode.s
mycode.s 依赖于 mycode.i
mycode.i 依赖于 mycode.c

所以先执行那个依赖方法就很明显了后进去的先执行
在这里插入图片描述

5.原理

那么make是如何工作的?

  1. make会在当前目录下找名字叫Makefile或者makefile的文件。
  2. 如果找到,它会找文件中的第一个目标文件(target),并把这个目标文件作为最终的文件。
  3. 如果mycode文件不存在,或者mycode所依赖的后面的mycode.o文件修改时间要比mycode要新。那么他会执行后面所定义的命令来生成这个mycode文件。
  4. 如果mycode依赖的文件mycode.o不存在,那么make会在当前文件夹找目标为mycode.o文件的依赖性,如果找到,再根据那个规则生成mycode.o文件。
  5. 这就是整个make的依赖性,make会一层一层去寻找文件的依赖关系,直到最终编译出第一个目标文件。当编译成功第一个目标文件后,make就不往下面进行编译了。
  6. 在寻找的过程中,如果发现错误,那么make会直接退出,并报错。而对于所定义的命令错误,或者编译不成功,make根本不理。
  7. make只管文件的依赖性。即,如果我找到依赖关系后,冒号后面的文件还是不在,那么make就直接罢工。

6.项目清理

  • 还记的我们编写Makefile中的.PHONY:clean吗?它表明clean总是被执行。跳出时间比较,那如果我们进行.PHONY:mycode操作呢?
    在这里插入图片描述
    在这里插入图片描述
    结果显而易见,我们可以一直make了,在也不用比较两个Modify时间了
  • 像clean这种,没有被第一个目标文件直接或间接关联,那么他后面的所定义的命令不会被自动执行。所以如果我们需要执行它,需要显示执行,如make clean 来清除目标文件,以便重新编译。
    在这里插入图片描述
  • 但是一般我们这种clean目标文件,我们将它设置为伪目标。用.PHONY修饰。伪目标的特点:总是被执行。

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

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

相关文章

C艹笔记--面向对象程序设计

文章目录类与对象简介类与结构的区别定义成员函数继承继承小总结[C中::和:, .和->的作用和区别](https://zhuanlan.zhihu.com/p/165992745)符号::和:的作用和区别:::一般用来表示继承符号.和->的作用和区别#include#include""和#include…

STM32入门——基本 GPIO 的输出控制

文章目录1 什么是 GPIO ?1.1 GPIO 简介1.2 GPIO 硬件解析1.2.1 保护二极管1.2.2 P-MOS、N-MOS 管1.2.3 数据输入输出寄存器1.2.4 复用功能输出1.2.5 模拟输入输出1.3 GPIO 的工作模式1.3.1 输入模式 (模拟/浮空/上拉/下拉)1.3.2 输出模式 (推挽/开漏)1.3.3 复用功能…

基于Nodejs+vue开发实现酒店管理系统

作者简介:Java、前端、Pythone开发多年,做过高程,项目经理,架构师 主要内容:Java项目开发、毕业设计开发、面试技术整理、最新技术分享 项目编号:BS-QD-KS-002 一,项目简介 本项目使用纯前端技…

mysql约束

文章目录mysql约束非空约束唯一性约束主键约束使用自增列:AUTO_INCREMENTFOREIGN KEY约束CHECK约束mysql约束 为什么需要约束?为了保证数据的完整性什么叫约束?对表中字段的限制约束的分类: 角度1:约束的字段个数&…

吴峰光杀进 Linux 内核

【编者按】吴峰光,Linux 内核守护者,学生时代被同学戏称为“老神仙”,两耳不闻窗外事,一心只搞 Linux。吴峰光的 Linux 内核之路,是天赋、兴趣、耐心、坚持的综合,这从一个补丁前后迭代了 16 个版本后还进行…

【初识Netty使用Netty实现简单的客户端与服务端的通信操作Netty框架中一些重要的类以及方法的解析】

一.Netty是什么? Netty 由 Trustin Lee(韩国,Line 公司)2004 年开发 本质:网络应用程序框架 实现:异步、事件驱动 特性:高性能、可维护、快速开发 用途:开发服务器和客户端 Netty的性能很高&#xff0…

字符串匹配算法(BF、KMP)

目录 1、暴力匹配(BF)算法 2、KMP算法 1、暴力匹配(BF)算法 BF算法,即暴力(Brute Force)算法,是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串T 的第一个字符进行匹配&a…

【树莓派不吃灰】配置samba,文件夹目录配置在闲置U盘,实现局域网文件共享

目录1. 前言2. 安装 Samba2.1 安装samba 和 samba-common-bin2.2 配置/etc/samba/smb.conf文件2.3 配置登录账号和密码2.4 重启 samba 服务2.5 回到windows,就可以在网络当中发现共享的文件夹3. 在Windows上挂载smb的共享目录3.1 打开windows的smb功能3.2 添加网络映…

Java --- springMVC实现RESTFul案例

一、使用springMVC实现RESTFul小案例 1.1、项目目录图&#xff1a; 1.2、代码实现&#xff1a; pom.xml文件&#xff1a; <packaging>war</packaging><!--添加依赖--><dependencies><!--SpringMVC--><dependency><groupId>org.spr…

黑马C++ 03 提高4 —— STL常用容器_string容器/vector容器/deque容器

文章目录一、string容器1. string基本概念2. string构造函数3. string赋值操作4. string字符串拼接5. string查找和替换6. string字符串比较7. string字符存取8. string字符串的插入和删除9. string子串二、vector容器(尾插尾删)1. vector基本概念2. vector构造函数3. vector赋…

【目标检测】基于yolov3的血细胞检测(无bug教程+附代码+数据集)

多的不说,少的不唠,先看检测效果图: 共检测三类:红细胞RBC、白细胞WBC、血小板Platelets Hello,大家好,我是augustqi。今天给大家带来的保姆级教程是:基于yolov3的血细胞检测(无bug教程+附代码+数据集) 1.项目背景 在上一期的教程中,我们基于yolov3训练了一个红细…

韩顺平linux(1-11小节)

运维工程师 服务器的规划、调试优化、日常监控、故障处理 物联网linux Linux主要指的是内核 ubuntu&#xff08;python偏爱&#xff09;&#xff0c;centos 发行版本 内核进行包装 1.4服务器领域 linux在服务器领域的应用是最强的。 linux免费、稳定、高效等特点在这里得到了很…

2019 Sichuan Province Programming Contest J. Jump on Axis

题目链接&#xff1a;https://codeforces.com/gym/102821/problem/J 题意&#xff1a;给你一个坐标k&#xff0c;每次从0开始走 每次有三个选择&#xff1a;选择1走一步&#xff0c;选择2走两步&#xff0c;选择3走三步 每次选第i个选择的时候&#xff0c;如果他没有被选过&…

MySQL是如何保证数据不丢失的

一.什么是两阶段提交 1.SQL语句&#xff08;update user set name‘李四’ where id3&#xff09;的执行流程是怎样的呢&#xff1f; 1.执行器先找引擎取 ID3这一行。ID 是主键&#xff0c;引擎直接用树搜索找到这一行。 2.如果 ID3 这一行所在的数据页本来就在内存中&#x…

力扣算法入门刷题

1、回文数 判断输入的整数是否是回文 我的一般思路&#xff1a; 将输入的整数转成字符串&#xff0c;再将这个字符串转成字符数组c&#xff0c;对字符数组进行遍历&#xff0c;如果第i个元素与第 c.length - i - 1 元素不相等&#xff0c;也就是通过比较首尾元素是否相同来判断…

自动化早已不是那个自动化了,谈一谈自动化测试现状和自我感受……

前言 从2017年6月开始接触自动化至今&#xff0c;已经有好几年了&#xff0c;从17年接触UI自动化&#xff08;unittestselenium&#xff09;到18年接触接口自动化&#xff08;unittestrequests&#xff09;再到18年自己编写自动化平台&#xff08;后台使用python的flask&#…

风、光、柴油机、蓄电池、电网交互微电网经济调度优化问题研究附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

爆破校园网的宽带

前提&#xff1a;学校的手机号前7位相同&#xff0c;宽带密码都是手机号后六位。仅供学习。 准备工作&#xff1a;电脑一台&#xff0c;把校园网的宽带水晶头插在电脑上&#xff0c; 步骤&#xff1a; winR输入Rasphone点击新建&#xff0c;宽带&#xff0c;输入宽带名称&am…

Vue复刻华为官网 (一)

1 分析 根据华为网页的布局&#xff0c;我们大体上可以将其划分为7个盒子&#xff0c;如下&#xff0c;由于写一个这样的网页再加上部分动态效果&#xff0c;需要的时间很长&#xff0c;本篇博客只记录了div1、div2、div3的静态效果轮播图的实现。 2 顶部盒子的实现 想要实现的…

【C++AVL树】4种旋转详讲

目录 引子&#xff1a;AVL树是因为什么出现的&#xff1f; 1.AVl树的的特性 2.AVl树的框架 3.AVL树的插入 3.1四种旋转&#xff08;左单旋、右单旋、左右双旋、右左双旋&#xff09; 3.1.1左单旋 3.1.2右单旋 3.1.3左右双旋 3.1.4右左双旋 总结 引子&#xff1a;AVL树是因…