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

news2024/11/14 6:23:06

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

  • 入门使用
  • 原理
    • 自动化构建
      • 递归式自动推导
    • 清理
    • 注意
  • 特殊符号

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

一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile 定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作

makefile 带来的好处就是 —— “自动化编译” ,一旦写好,只需要一个 make 命令,整个工程完全 自动编译 ,极大的提高了软件开发的效率

make 是一个 命令工具 ,是一个解释 makefile 中指令的命令工具,一般来说,大多数的 IDE 都有这个命令,比如: Delphi 的 make , Visual C++ 的 nmake ,Linux 下 GNU 的 make ;可见 makefile 都成为了一种在工程方面的 编译方法

入门使用

首先: make 是一条命令,makefile 是一个文件,两个搭配使用,完成项目自动化构建

现在在当前路径下有 code.c 代码,需要手动 touch 一个名为 makefileMakefile 的文件

在里面写上如下代码:

mycode:code.c
	gcc -o mycode code.c -std=c99
.PHONY:clean
clean:
	rm -f mycode
  • 构建可执行文件
    • mycode:code.cmycode 是指未来形成的 可执行程序code.c 是指此可执行程序依赖 code.c 文件
    • gcc -o mycode code.c -std=c99 这一行前面有一个 Tab 键,内容就是 编译 指令,不多说
  • 清理
    • 接下来的指令就都是清理所用

返回命令行,运行 make 指令,即可构建可执行程序 mycode ;运行 make clean 即可清理 mycode 文件

至此,你已经完成了入门使用 ^ ^

原理

自动化构建

先看下图:
在这里插入图片描述

这里的每一行都有其名称

  • 依赖关系
    • : 右边是 依赖文件列表 ,图中就只有 code.c 文件;可以为空,但若有多文件,以空格为分隔符,例: code1.c code2.c code3.c
    • : 左边是 目标文件 ,图中为 mycode 可执行程序
  • 依赖方法
    • 在单纯语法上,这一行 必须以 Tab 键开头,也不可是 4 个空格

当你在运行指令 make 后,会在当前目录下寻找 makefile 文件,根据 makefile 文件里的 依赖关系 ,遵循 依赖方法 ,为你完成 依赖方法 里的工作,生成 目标文件

递归式自动推导

当你知道目标文件如何生成时,再来看看类似 递归式的连锁生成
先来看看 makefile 文件:

mycode:code.o
	gcc code.o -o mycode
code.o:code.s
	gcc -c code.s -o code.o
code.s:code.i
	gcc -S code.i -o code.s -std=c99
code.i:code.c
	gcc -E code.c -o code.i

这就是 gcc 编译的每一步明细,在这里不做详细解释(如不明白,请查阅过往 gcc 拙作)

  1. 我们知道最终的目标文件是 mycode 可执行程序,但 : 后面的依赖文件 code.o 在我们当前路径下并没有
  2. 于是 make 就会在 makefile 文件里寻找名为 code.o 的目标文件
  3. 找到之后会根据 : 后面的依赖文件,再根据依赖方法来生成 code.o 目标文件
  4. 但当前路径下 code.o 的依赖文件 code.s 也没有,那 make 就会继续在 makefile 文件里寻找名为 code.s 的目标文件
  5. 于是一直找到 code.i 目标文件,它的依赖文件是存在的,那么就会生成 code.i ,继而生成 code.scode.o 直至最后的 mycode 可执行程序

那么这就很类似 栈式结构的递归调用 ,而上述就是 自动推导 makefile 中的依赖关系 的过程,即使乱序也可构建执行

清理

先看看 makefile 里的 clean 部分

clean:
	rm -f code.i code.s code.o mycode

是否感觉和你要自动化构建的可执行程序写法十分相似?

实际上 clean 就是 makefile 里的 目标文件,只是它没有 依赖文件 而已(依赖文件列表可以为空),而下面就是 依赖方法 ,完成 依赖方法 里的工作,即为清理完成

而你要执行清理,就是生成 clean 这个目标文件,命令行也就需要在 make 后面指定要生成的目标文件,所以是:

make clean

注意

  • 当你直接 make 时,make 会默认生成 makefile 里的第一个目标文件
  • 如果你要生成 makefile 里的其他的目标文件,就在 make 后面带上你要生成的目标文件( clean 就是如此)
  • 当你第二次再运行 make 时,只要 源文件 没有被更新修改,就会告诉你要生成的 目标文件 是最新的,不让你继续 make ,因为没有必要,为了提高效率(实现方法就是对比 源文件目标文件 的最近修改时间)
  • 要想 目标文件 总是被执行,需要在 目标文件 前添加 .PHONY 声明,相当于告诉 make 不要管什么时间问题;而此时的 目标文件 也被称为 伪目标

特殊符号

依赖关系 里存在 目标文件依赖文件列表

那么在 依赖方法 里,就可以利用 $@$^ 分别表示 目标文件 和整个 依赖文件列表

在我们成功 make 时,命令行会给我们回显自动化构建的步骤,如果不想回显,可在 依赖方法 最前面添加 @

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

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

相关文章

神奇海洋养鱼小程序游戏广告联盟流量主休闲小游戏源码

在海洋养鱼小程序中,饲料、任务系统、系统操作日志、签到、看广告、完成喂养、每日签到、系统公告、积分商城、界面设计、拼手气大转盘抽奖以及我的好友等功能共同构建了一个丰富而互动的游戏体验。以下是对这些功能的进一步扩展介绍: 饲料 任务奖励&a…

使用JWT的SpringSecurity实现前后端分离

1. SpringSecurity完成前后端完全分离 分析: 前后端分离:响应的数据必须为JSON数据,之前响应的是网页 需要修改的代码有: 登录成功需要返回json数据登录失败需要返回json数据权限不足时返回json数据未登录访问资源返回json数据 1.…

英国AI大学排名

计算机学科英国Top10 “计算机科学与信息系统”学科除了最受关注的“计算机科学”专业,还包括了“人工智能”“软件工程”“计算机金融”等众多分支专业。 1.帝国理工学院 Imperial College London 单以计算机专业本科来讲,仅Computing这个专业&#x…

双线性插值(Bilinear Interpolation)

文章目录 一.双线性插值3.双线性插值的优化 一.双线性插值 假设源图像大小为mxn,目标图像为axb。那么两幅图像的边长比分别为:m/a和n/b。注意,通常这个比例不是整数,编程存储的时候要用浮点型。目标图像的第(i,j&…

正点原子imx6ull-mini-Linux驱动之Linux LCD 驱动实验(19)

LCD 是很常用的一个外设,在裸机篇中我们讲解了如何编写 LCD 裸机驱动,在 Linux 下 LCD 的使用更加广泛,在搭配 QT 这样的 GUI 库下可以制作出非常精美的 UI 界面。本章我们 就来学习一下如何在 Linux 下驱动 LCD 屏幕。 1:Linux …

奇安信高管合计套现7.7亿,总裁个人套现1.9亿

【文末送:技战法】 昨天网安一哥,奇安信发布《关于中电金投增持公司股份暨持股 5% 以上股东协议转让公司股份的权益变动的提示性公告》,公告显示中国电子将再次收购奇安信5%的股份。 公告显示,奇安壹号合伙人中:天津…

[Meachines] [Easy] OpenAdmin OpenNetAdmin-RCE+RSA私钥解密+Nano权限提升

信息收集 IP AddressOpening Ports10.10.10.171TCP:22,80 $ nmap -p- 10.10.10.171 --min-rate 1000 -sC -sV PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0) | ssh-hostkey: | 2048 4b:98:df:85:d1:7…

深入理解操作系统--进程(1)

文章目录 概述进程,轻量级进程和线程进程描述符linux进程四要素创建进程linux3个系统调用创建新的进程do_fork函数copy_process函数 撤销进程 小结 概述 这一章,主要讲的是进程的概念,即程序执行的一个实例。在linux源代码中,通常…

图像像素增强albumentations库的使用

albumentations是一个快速的图像增强库,用于机器学习任务。它支持各种类型的图像变换,包括但不限于旋转、平移、缩放、剪切、翻转、噪声注入、遮挡等。albumentations库可以与深度学习框架如PyTorch和TensorFlow很好地集成, 支持种类丰富的像素级变换,包括雨天、雾天、色域变…

使用Python绘制雷达图的简单示例

雷达图(Radar Chart)也被称为蜘蛛网图、星形图或极坐标图,是一种用于显示多变量数据的图形方法。它以一个中心点为起点,从中心点向外延伸出多条射线,每条射线代表一个特定的变量或指标。每条射线上的点或线段表示该变量…

面试官:如何保证缓存和数据库的一致性?

你好呀,我是苍何! 办公室里鸦雀无声,我木然的看着窗外射进来的阳光,它照在光滑的地板上,又反射到天花板上,再从天花板上反射下来时,就变成一片弥散的白光。 我在白光里偷偷放了一个恶毒的臭屁…

二百五十四、OceanBase——Linux上安装OceanBase数据库(四):登录ocp-express,配置租户管理等信息

一、目的 在部署OceanBase成功后,接下来就是登录ocp-express,配置租户管理等信息! 二、ocp-express网址以及账密信息 三、实施步骤 1 登录ocp-express 2 集群总览 3 租户管理 3.1 新建租户 3.2 配置新租户信息 剩下的几个模块了解即可&am…

redis实现的分布式锁redisson

redis服务宕机出现的概率很低,redis集群整体的思想是AP思想(优先保证高可用性) 如果非要保证业务数据强一致性建议采用CP思想,用zookeeper实现分布式锁。

C++自定义接口类设计器之模板代码生成四

关键代码 QStringList multis templateStr.split(\n);bool startConfig false;bool startVar false;bool startTemplate false;for (const auto& line : multis) {if(startConfig) {if(line.trimmed().startsWith("camealCase")) {auto name_val line.split…

Web开发-html篇-上

HTML发展史 HTML的历史可以追溯到20世纪90年代初。当时,互联网尚处于起步阶段,Web浏览器也刚刚问世。HTML的创建者是蒂姆伯纳斯-李(Tim Berners-Lee),他在1991年首次提出了HTML的概念。HTML的初衷是为了方便不同计算机…

TOA/TDOA测距定位,三维任意(>3)个锚节点,对一个未知点进行定位|MATLAB源代码

目录 程序介绍程序截图和运行结果程序截图运行结果 源代码代码修改建议 程序介绍 TOA/TDOA使用三点法测距,在空间中,有4个锚节点就可以定位,但如果有多个节点,定位效果会更好。 锚点不同时,修改程序中的向量和矩阵维度…

C++——哈希结构

1.unordered系列关联式容器 本节主要介绍unordered_map和unordered_set两个容器&#xff0c;底层使用哈希实现的 unordered_map 1.unordered_map是储存<key,value>键值对的关联式容器&#xff0c;其允许通过key快速查找到对应的value&#xff0c;和map非常相似&#x…

JavaFX布局-ToolBar

JavaFX布局-ToolBar 常用属性orientationpadding 实现方式Java实现fxml实现 容纳一组按钮的容器支持水平、垂直布局内容太多&#xff0c;会自动折叠 常用属性 orientation 排列方式&#xff0c;Orientation.VERTICAL、Orientation.HORIZONTAL flowPane.setOrientation(Orient…

【时时三省】(C语言基础)函数递归练习

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ——csdn时时三省 求字符串长度 求的是arr里面字符串的长度 abc后面还有一个\0为结束标志 在结算字符串长度的时候不算\0 所以它的长度是3 模拟实现一个strlen函数 str等于\0的时候就会结束返回count 如果…

纯css的loading效果

在之前的文章里面实现loading组件的封装 其实在日常生活中我们可以采用纯css的组件方式实现loading 的效果 其中<p>元素被绝对定位在其父元素的中心&#xff0c;并且其内部的文本大小和对行间距&#xff08;line-height&#xff09;是响应式的&#xff0c;基于视口宽度&…