【Linux必备工具】自动化构建工具makefile的使用详解

目录

引言

Makefile 简介

依赖关系与依赖方法

make运行规则

依赖关系示例

依赖方法

Makefile 工作原理

示例代码

清理项目与伪目标

清理示例

.PHONY总是被执行

文章手稿:


文章手稿见文末~

引言

项目构建时遇到的各种挑战如文件编译顺序、库链接、依赖文件的管理等,在不同开发环境中会有不同的解决方案。

在 Visual Studio (VS) 环境中,这些问题往往被自动处理,运行直接 Ctrl + F5 就可以了,编译个项目真的轻轻松松。 那是因为 VS 帮你自动维护了对应的项目结构!

那如果需要手动实现呢:多文件   我们先编译哪一个程序?链接需要哪些库?整个项目结构,该如何维护......在 Linux 环境中,我们需要更手动、细致地管理这些方面。为了解决这个问题,Linux 提供了自动化构建工具 Makefile

Makefile 简介

Makefile 是 Linux 下用于管理文件依赖和编译顺序的一个重要工具。它用于定义项目中的各个源文件如何编译链接,可以极大地提高开发效率。

Makefile 文件中定义了一系列规则,指定文件编译顺序、文件依赖关系及各文件的编译方法。make 命令是一个解释 Makefile 文件的命令工具,可以完成项目的自动化构建。

依赖关系与依赖方法

在一个大项目中例如一不小心写反gcc的执行,可执行程序就覆盖掉了原文件,最后导致你的源代码都没了……由此可见,在命令行操作时如果出现误操作,就会翻车。正是因为这些悲剧的存在,使得 Makefile 的光芒愈发温暖!

我们先做一些准备工作,touch makefile ,然后vim 输入以下指令

可以将依赖关系和依赖方法类比为生活中的要钱例子:打电话告诉爸爸"我是你儿子"表示依赖关系,而要求给你打钱表明了依赖方法。只有同时满足依赖关系和依赖方法,才能成功达到目的,即完成编译和链接。

在 Makefile 中,最核心的概念是依赖关系和依赖方法。依赖关系用于指定某个目标文件依赖哪些源文件,当这些源文件发生变化时,需要重新生成目标文件。依赖方法则是生成目标文件所执行的具体命令。

效果:

以后我们在 Linux 下编译代码就不需要敲 gcc 命令了,直接 make 就可以了,尤其是在大项目中会特别的方便

make运行规则

❓ 思考:为什么 make 的时候它总是执行第一个呢?

 makefile 在形成文件时会自顶而下扫描,默认只会形式第一个目标文件,执行该依赖关系的依赖方法。 

我们这里有两个目标文件,一个是 mytest 一个是 clean,凭什么我 make 执行的是 mytest 而不是 clean?答案很简单,就凭 mytest 是在前面写的

 如果我们把它们两的顺序换一下:

因为上下位置的调换,修改了make的默认操作

依赖关系示例

假设我们有以下文件依赖关系:

hello: hello.o
hello.o: hello.s
hello.s: hello.i
hello.i: hello.c

依赖方法

使用 gcc 命令编译不同中间文件:

hello: hello.o
	gcc hello.o -o hello

hello.o: hello.s
	gcc -c hello.s -o hello.o

hello.s: hello.i
	gcc -S hello.i -o hello.s

hello.i: hello.c
	gcc -E hello.c -o hello.i

在上述例子中,hello 是最终目标文件,它依赖于目标文件 hello.o,而后者又进一步依赖于 hello.s,如此递归下去直到源文件 hello.c

Makefile 工作原理

  1. make 命令查找名为 Makefile 或 makefile 的文件。
  2. 读取文件并找到第一个目标文件,在本例中是 hello
  3. 如果 hello 不存在,或其依赖文件中任何一个文件比 hello 更新,则生成 hello 文件。
  4. 递归检查每个依赖文件,按顺序进行必要的编译步骤。
  5. 如果出现错误,make 退出并报错。
  6. 如果依赖文件仍然不在,make 也将退出。

示例代码

这是一个简单的 C 代码示例和相应的 Makefile 文件:

// hello.c
#include <stdio.h>
int main() {
    printf("hello Makefile!\n");
    return 0;
}
# Makefile
hello: hello.o
	gcc hello.o -o hello

hello.o: hello.c
	gcc -c hello.c -o hello.o

.PHONY: clean
clean:
	rm -f hello.o hello

在这个示例中,hello 目标文件依赖于 hello.o 文件,而 hello.o 则由 hello.c 编译生成。clean 是一个伪目标,无论何时执行 make cleanclean 中的命令都会被执行,达到清理文件目的。

清理项目与伪目标

工程经常需要清理生成的中间文件和目标文件,Makefile 提供了方便的清理机制。通过定义伪目标,可以确保 make clean 总能执行对应的清理命令。

清理示例

代码:

.PHONY: clean
clean:
	rm -f hello.o hello

 clean  没有依赖文件,也是存在依赖关系的,只不过这个  clean  没有依赖列表。

.PHONY 用于标记 clean 为伪目标,无论当前目录下是否有 clean 文件或目标,make clean 命令都会执行。

效果:

.PHONY总是被执行

我们刚才看了 "总是不被执行" 的现象,我们试试给我们的 mytest 也用 ​{\color{Red} .PHONY},让它从默认的 "总是不被执行" 变成 "总是被执行" 看看

但为了提高效率,我们一般不建议这样

实际上是make一次,如果未发生改变就不会再执行了

详细解释如下:

我们打开文件修改,Access 应不应该改变呢?我们读取 Access 变不变?

要变的!但是现在不会变!因为访问文件的频率是最高的,Modify 和 Change 是不得不变的,不变的化文件就不对了。但是我们大多数情况修改文件属性和修改文件内容是很低频的事情,但打开文件是非常高平的事情,Linux 后期内核对 Access 进行了优化,将文件打开访问,打开时间不会变化,累计一段时间后他才会变化。如果不这样,打开文件这种高频率的事情,一旦更新 Access 时间,就要将数据刷新到磁盘上,这实际上一个很没效率的事情。

具体 Access 的调整策略取决于 Linux 的版本。

让我们再来回答一下最初的怎么做到的?

通过对比你的源文件和可执行程序的更改时间 (modify time) 识别的新旧。 根据原文件和可执行程序的最近修改时间,评估要不要重新生成

文章手稿:

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

“湖仓一体架构及其应用”写作框架,系统架构设计师

论文真题 随着5G、大数据、人工智能、物联网等技术的不断成熟&#xff0c;各行各业的业务场景日益复杂&#xff0c;企业数据呈现出大规模、多样性的特点&#xff0c;特别是非结构化数据呈现出爆发式增长趋势。在这一背景下&#xff0c;企业数据管理不再局限于传统的结构化OLTP…

高互动UI设计揭秘:动画效果如何提升用户体验

动画&#xff0c;由于其酷的视觉冲击&#xff0c;往往会产生极好的用户体验。UI设计中的动态效果可以使用户界面看起来更酷&#xff0c;特别是界面的功能动画&#xff0c;是UX设计的重要组成部分&#xff0c;不容忽视。为什么UI设计的动态效果如此重要&#xff1f;接下来&#…

WIFI6E中的MESH组网功能

什么是WIFI6E和MESH组网&#xff1f; WIFI 6E 是扩展到6GHz 频段的WIFI 6无线通信技术&#xff0c;而“WIFI 6E”中的“6”是指WIFI技术的“第6代”&#xff0c;“E”则是指使用新频段的标准的最新扩展。WIFI 6E通过增加6GHz频段&#xff0c;提供更高的带宽、更低的延迟和更大…

探索Lazada商品数据宝库——一键获取商品详细数据信息

一、引言 在电商领域&#xff0c;Lazada凭借其广泛的商品种类和便捷的购物体验&#xff0c;成为东南亚地区备受欢迎的电商平台。然而&#xff0c;对于许多商家和数据分析师来说&#xff0c;获取商品详细数据信息却是一项繁琐而重要的任务。为了解决这个问题&#xff0c;我们精…

深圳学区房断崖式跌价,3年跌去10万元,更可怕的还在后面

就在房市回暖之际&#xff0c;深圳的学区房却传来让人震惊的消息&#xff0c;深圳八卦岭有小区的房价三年时间从14万元每平方跌至4万元每平方&#xff0c;这对于当下的楼市无疑是重磅炸弹&#xff0c;对人们的购房行为将产生重要影响。 深圳这个受到关注的小区为一个宿舍小区&a…

图像分割(二)——低照度下自然场景下图像分割的一种新方法

一天傍晚&#xff0c;在景观河散步&#xff0c;看到景观河旁边雕塑鸭子&#xff0c;就用手机拍摄下来&#xff0c;但由于是晚上光线不是太好&#xff0c;且雕塑下面的地板有条纹和阴影。想着尝试用传统的数字图像处理方法把鸭子从自然场景中提取出来。 读入低照度下图像&#…

Seal^_^【送书活动第7期】——《IT项目经理进阶之道》

Seal^_^【送书活动第7期】——《IT项目经理进阶之道》 一、参与方式二、本期推荐图书2.1 作者荐语2.2 编辑推荐2.3 图书简介2.4 前言2.5 目 录 三、正版购买 从领导、客户、下属、供应商四个角度&#xff0c;介绍IT项目经理在实际工作中需要面对的挑战&#xff0c;以及一些常见…

【网络安全学习】漏洞扫描:-03- Nikito与Wapiti漏洞扫描的使用

1️⃣ Nikto漏洞扫描 Nikto是一个开源的Web扫描评估程序&#xff0c;它可以对目标Web服务器进行快速而全面的检查&#xff0c;以发现各种潜在的安全问题和漏洞。 &#x1f170;️ 如何使用 ❓ nikto -Display 1234ep -h [域名或IP地址] -o nikto.html # -h参数&#xff1a;指…

实战18:基于tkinter+jupyter notebook开发的情感分析系统

项目演示: 完整代码: import pandas as pd import numpy as np from collections import Counter import re import jieba from tqdm import tqdm from sklearn.metrics import roc_curve, auc import joblib import gensim from sklearn.svm import SVC from gensim.mode…

docker启动nacos挂载目录并修改配置文件

1 通过 Docker 拉取 nacos 镜像 docker pull nacos/nacos-server:v2.1.22 创建宿主机挂载目录 # 用于挂载 nacos 的日志 mkdir -p /mydata/nacos_home/logs/ # 用于挂载 nacos 的配置 mkdir -p /mydata/nacos_home/conf/ # 用于挂载 nacos 的数据 mkdir -p /mydata/nacos_hom…

小林图解系统-四.内存管理 4.1 为什么要有虚拟内存?

虚拟内存 单片机没有操作系统&#xff0c;单片机的CPU是直接操作内存的物理地址。 要想在内存中同时运行两个程序是不可能的。如果第一个程序在2000的位置写入一个新的值&#xff0c;将会擦掉第二个程序存放在相同位置上的所有内容&#xff0c;所以同时运行两个程序会立刻崩溃…

远程桌面修改端口号后无法连接,怎么解决

远程桌面连接让用户在不同地点&#xff0c;不同设备上远程控制一台计算机&#xff0c;很大程度上节约了用户的成本并且提高了办公的灵活性和高效性。有时候修改了端口号就会连接不上&#xff0c;那该怎么办呢&#xff1f; 1. 检查本地计算机和远程计算机是否都连接了网络且网…

《精通嵌入式Linux编程》——解锁嵌入式Linux开发的无限可能

文章目录 &#x1f4d1;前言一、书籍概览与作者风采二、内容详解与特色亮点2.1 嵌入式Linux基础与入门2.2 系统编程与内核探索2.3 驱动开发与实战演练2.4 内存管理与性能优化2.5 系统调试与性能提升2.6 综合项目实践与案例分析 三、书籍价值与应用展望 &#x1f4d1;前言 在当今…

利用反向代理编写HTTP抓包工具——可视化界面

手写HTTP抓包工具——可视化界面 项目描述语言golang可视化fynev2功能代理抓包、重发、记录 目录 1. 示例1.1 主界面1.2 开启反向代理1.3 抓包1.4 历史记录1.5 重发 2. 核心代码2.1 GUI2.1 抓包 3. 结语3.1 传送门 1. 示例 1.1 主界面 1.2 开启反向代理 1.3 抓包 1.4 历史记录…

国产32位高精度低功耗DSP音频处理芯片-DU561

DU561是一款集成多种音效算法高性能32位DSP音频处理芯片&#xff1b;具有高速、高精度、高稳定性等特点&#xff0c;能实现对音频信号的滤波、增强、降噪、混响、变调等处理&#xff0c;广泛应用于音频系统、通信系统、汽车音响、家庭影院、舞台设备等领域。 音频处理可以更好地…

ShuffleNet系列论文阅读笔记(ShuffleNetV1和ShuffleNetV2)

目录 ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices摘要Approach—方法Channel Shuffle for Group Convolutions—用于分组卷积的通道重排ShuffleNet Unit—ShuffleNet单元Network Architecture—网络体系结构 总结 ShuffleNet V2: Pra…

工业无线网关在实际生产中的应用效果和价值-天拓四方

随着智能制造的快速发展&#xff0c;工业无线网关作为关键通信设备&#xff0c;在提升生产效率、优化生产流程、实现设备间的互联互通等方面发挥着越来越重要的作用。以下是一个关于工业无线网关在智能制造行业应用的具体案例&#xff0c;展示了其在实际生产中的应用效果和价值…

toLocaleString浏览器兼容问题,导致时间在不同版本显示24/12小时制

先看toLocaleString结果区别 旧版 新版 问题原因 Google Chrome 和其他浏览器会定期更新&#xff0c;这些更新可能包括对 JavaScript 引擎和国际化的改进较新版本的 Chrome&#xff08;版本 125.0.6422.142&#xff09;已经更新了其国际化实现&#xff0c;以默认使用24小时制 …

SpringBoot整合justauth实现多种方式的第三方登陆

目录 0.准备工作 1.引入依赖 2.yml文件 3. Controller代码 4.效果 参考 0.准备工作 你需要获取三方登陆的client-id和client-secret 以github为例 申请地址&#xff1a;Sign in to GitHub GitHub 1.引入依赖 <?xml version"1.0" encoding"UTF-8&quo…