当前位置: 首页 > news >正文

Mastering Makefile:模块化编程技巧与经验分享

在Linux项目管理中,Makefile是一个强大的工具,它可以帮助我们自动化编译和测试过程。然而,随着项目的增长,Makefile可能会变得越来越复杂,难以管理。在这篇文章中,我将分享一些模块化编程的技巧和经验,帮助你更好地管理你的Makefile。

  1. 使用反斜杠进行换行

    在Makefile中,我们可以使用反斜杠(\)进行换行。这是一个很有用的技巧,可以使我们的Makefile更易读,更易管理。例如:

    target: dependencies \command1 \command2 \command3
    

    在这个例子中,command1command2command3都是target的命令,尽管它们在不同的行上。只要在行尾添加反斜杠,就可以在下一行继续编写命令。

  2. 模块化你的Makefile

    随着项目的增长,你的Makefile可能会变得越来越大。为了更好地管理它,你可以将它分解成多个模块。每个模块都有自己的目标和依赖项,这样可以使你的Makefile更易读,更易管理。

    例如,你可以创建一个名为compile.mk的Makefile模块,专门用于编译你的代码。然后,在你的主Makefile中,你可以使用include指令来包含这个模块:

    include compile.mk
    
  3. 使用变量

    在Makefile中,你可以使用变量来存储常用的值。这可以使你的Makefile更易读,更易管理。例如,你可以创建一个变量来存储你的编译器选项:

    CFLAGS = -Wall -Werror
    

    然后,你可以在你的命令中使用这个变量:

    target: dependencies$(CC) $(CFLAGS) -o target dependencies
    
  4. 使用模式规则
    在Makefile中,模式规则是一种强大的工具,它允许你使用一种模式来匹配多个目标。模式规则的基本形式如下:

%.o: %.ccommand

在这个模式规则中,%.o是目标模式,%.c是依赖模式。%是一个通配符,它可以匹配任何字符串。所以这个规则的含义是:任何.o文件都依赖于一个同名的.c文件,而且可以通过执行command来从.c文件生成.o文件。

以下是一些常见的模式规则及其使用实例:

4.1. 编译C源文件

%.o: %.c$(CC) $(CFLAGS) -c $< -o $@

在这个例子中,$<表示依赖列表中的第一个文件,$@表示目标文件。所以这个规则的含义是:任何.o文件都依赖于一个同名的.c文件,而且可以通过执行$(CC) $(CFLAGS) -c $< -o $@来从.c文件生成.o文件。

4.2. 链接对象文件

%: %.o$(CC) $(LDFLAGS) $^ -o $@

在这个例子中,$^表示所有的依赖文件,$@表示目标文件。所以这个规则的含义是:任何可执行文件都依赖于一个同名的.o文件,而且可以通过执行$(CC) $(LDFLAGS) $^ -o $@来从.o文件生成可执行文件。

4.3. 生成依赖文件

%.d: %.c$(CC) -M $< > $@

在这个例子中,$<表示依赖列表中的第一个文件,$@表示目标文件。所以这个规则的含义是:任何.d文件都依赖于一个同名的.c文件,而且可以通过执行$(CC) -M $< > $@来从.c文件生成.d文件。

这些只是模式规则的一些基本用法,实际上模式规则的应用非常广泛,可以根据你的需要进行灵活的定制。
模式规则在Makefile中的应用非常广泛,它们可以用于各种不同的任务。以下是一些更高级的模式规则的应用实例:

4.4. 生成PDF文件

如果你正在编写LaTeX文档,你可以使用模式规则来自动化PDF文件的生成过程:

%.pdf: %.texpdflatex $<

在这个例子中,$<表示依赖列表中的第一个文件。所以这个规则的含义是:任何.pdf文件都依赖于一个同名的.tex文件,而且可以通过执行pdflatex $<来从.tex文件生成.pdf文件。

4.5. 压缩图片文件

如果你的项目中包含了很多图片文件,你可以使用模式规则来自动化图片文件的压缩过程:

%.jpg: %.pngconvert $< $@

在这个例子中,$<表示依赖列表中的第一个文件,$@表示目标文件。所以这个规则的含义是:任何.jpg文件都依赖于一个同名的.png文件,而且可以通过执行convert $< $@来从.png文件生成.jpg文件。

4.6. 生成HTML文件

如果你正在编写Markdown文档,你可以使用模式规则来自动化HTML文件的生成过程:

%.html: %.mdpandoc $< -o $@

在这个例子中,$<表示依赖列表中的第一个文件,$@表示目标文件。所以这个规则的含义是:任何.html文件都依赖于一个同名的.md文件,而且可以通过执行pandoc $< -o $@来从.md文件生成.html文件。
在无人驾驶汽车领域,Makefile也可以发挥重要的作用,特别是在软件开发和测试的过程中。以下是一些可能的应用场景和经验分享:

4.7. 自动化测试

在无人驾驶汽车的软件开发中,自动化测试是非常重要的。使用Makefile,你可以自动化你的测试过程,例如:

test: main./main < input.txt > output.txtdiff output.txt expected_output.txt

在这个例子中,test目标依赖于main可执行文件,可以通过执行./main < input.txt > output.txtdiff output.txt expected_output.txt来运行测试并检查输出是否符合预期。

4.8. 生成文档

在无人驾驶汽车的软件开发中,生成和维护文档也是非常重要的。使用Makefile,你可以自动化你的文档生成过程,例如:

doc: main.cpp helper.cppdoxygen Doxyfile

在这个例子中,doc目标依赖于main.cpp和helper.cpp,可以通过执行doxygen Doxyfile来生成文档。

总的来说,无论你是在无人驾驶汽车的哪个领域工作,Makefile都可以帮助你自动化你的工作流程,提高你的工作效率。


分享一个有趣的 学习链接:https://xxetb.xet.tech/s/HY8za

相关文章:

Mastering Makefile:模块化编程技巧与经验分享

在Linux项目管理中&#xff0c;Makefile是一个强大的工具&#xff0c;它可以帮助我们自动化编译和测试过程。然而&#xff0c;随着项目的增长&#xff0c;Makefile可能会变得越来越复杂&#xff0c;难以管理。在这篇文章中&#xff0c;我将分享一些模块化编程的技巧和经验&…...

el-input输入校验插件(正则表达式)

使用方法&#xff1a;在main.js文件中注册插件然后直接在<el-input>加入‘v-插件名’ (1)在main.js文件&#xff1a; // 只能输入数字指令 import onlyNumber from /directive/only-number; Vue.use(onlyNumber); &#xff08;2&#xff09;在src/directive文件夹中 &a…...

【Matplotlib】plt.plot() X轴横坐标展示完整整数坐标

比如说&#xff0c;我的数据应该是 x轴从2到21的20个整数 y轴对应值 但是直接plot的话x轴显示居然有小数点什么鬼 可以这样改...

左手 Jira,右手 Polarion,驶入互联网和制造业十字路口的新能源汽车

笔者之前一直在互联网公司从事软件研发&#xff0c;创立 Bytebase 之后&#xff0c;才开始接触到各行各业的用户。最近来自汽车行业的客户不少&#xff0c;所以就翻翻相关资料。周末微信收到了一条推送&#xff0c;提到汽车行业的软件研发管理&#xff0c;也由此了解到了 Polar…...

网络安全(黑客)-0基础小白自学

1.网络安全是什么 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 2.网络安全市场 一、是市场需求量高&#xff1b; 二、则是发展相对成熟…...

ActiveMQ、RabbitMQ、RocketMQ、Kafka介绍

一、消息中间件的使用场景 消息中间件的使用场景总结就是六个字&#xff1a;解耦、异步、削峰 1.解耦 如果我方系统A要与三方B系统进行数据对接&#xff0c;推送系统人员信息&#xff0c;通常我们会使用接口开发来进行。但是如果运维期间B系统进行了调整&#xff0c;或者推送过…...

unity打AB包,AssetBundle预制体与图集(二)

第二步&#xff1a;加载AB包的资源&#xff0c;用于显示 using System.Collections; using System.Collections.Generic; using System.IO; using UnityEngine; using UnityEngine.Networking; using UnityEngine.U2D; using UnityEngine.UI;public class GameLaunch : MonoBe…...

【网络安全 --- web服务器解析漏洞】IIS,Apache,Nginx中间件常见解析漏洞

一&#xff0c;工具及环境准备 以下都是超详细保姆级安装教程&#xff0c;缺什么安装什么即可&#xff08;提供镜像工具资源&#xff09; 1-1 VMware 16.0 安装 【网络安全 --- 工具安装】VMware 16.0 详细安装过程&#xff08;提供资源&#xff09;-CSDN博客文章浏览阅读20…...

Python基础——注释、缩进、语法、标识符、关键字

注释 Python中单行注释用#表示&#xff0c;多行注释由3对双引号或单引号包裹&#xff1a;可以使用快捷键CTRLR进行注释 # 我是单行注释"""我是多行注释 """缩进 python使用“缩进”即一行代码前的空白区域确定代码之间的逻辑关系和层次关系。…...

排序算法的分析及实现

目录​​​​​​​ 1. 排序 1.1. 排序的概念 1.2. 排序的稳定性 1.3. 内部排序和外部排序 2. 直接插入排序 2.1. 直接插入排序 2.2. 直接插入排序的两种情况 1. 情况一 2. 情况二 2.3. 直接插入排序的单趟排序 2.4. 直接插入排序的完整实现 2.5. 直接插入排序的时…...

rancher或者其他容器平台使用非root用户启动jar

场景&#xff1a; java程序打成镜像&#xff0c;在rancher上运行&#xff0c;默认是root账户&#xff0c;发现hdfs或者hive不允许root账户操作&#xff1b;所以打算用费root账户启动jar&#xff0c;使其具有hive和hdfs的操作权限。 Dockerfile entrypoint.sh 思路就是上面这样…...

Scrapy使用和学习笔记

前言 Scrapy是非常优秀的一个爬虫框架&#xff0c;基于twisted异步编程框架。yield的使用如此美妙。基于调度器&#xff0c;下载器可以对scrapy扩展编程。插件也是非常丰富&#xff0c;和Selenium&#xff0c;PlayWright集成也比较轻松。 当然&#xff0c;对网页中的ajax请求…...

<sa8650> sa8650介绍

一、sa8650 描述 设备说明 QAM8650P/QAMSRV1H是高通公司的下一代Snapdragon高级驾驶员辅助系统(ADAS)模块,旨在实现卓越的性能和电源效率。 它已被开发为SEooC(上下文之外的安全元素),针对假定的ASIL B用例*。QAM8650P/QAMSRV1H模块的关键组件包括SA8650P/SRV1H SoC、PM…...

[架构之路-244]:目标系统 - 设计方法 - 软件工程 - 软件开发方法:结构化、面向对象、面向服务、面向组件的开发方法

目录 前言&#xff1a; 一、概述: 软件聚合的程度由简单到复杂 二、主要开发方法详见 2.1 结构化的开发方法 2.2 面对对象的开发方法 2.3 面向服务的开发方法 2.4 面向组件的开发方法 三、不同开发方法比较 3.1 结构化开发方法 3.2 面向对象(OOP)开发方法 3.3 面向服…...

Qt窗体自动销毁

Qt中通过对象树的方式&#xff0c;实现了窗体自动析构&#xff0c;只要我们使用得当&#xff0c;就能免去自己去释放窗体对象的内存&#xff0c;但是我们得清楚Qt窗体自动析构的机制&#xff0c;什么情况下能够自动析构&#xff0c;什么情况不能。操作不当的情况可能造成内存泄…...

制造业企业设备管理常见的三个问题及对应的解决方案

当今的市场如同茫茫大海&#xff0c;既充满机遇&#xff0c;也伴随着波动的风险。在现代制造业中&#xff0c;企业常常面临着各种挑战&#xff0c;这些挑战可能妨碍其发展和竞争力。但制造企业往往具备能够解决挑战的能力&#xff0c;借助软件工具的力量&#xff0c;可以更好地…...

linux文件目录

/bin 二进制可执行命令。该目录下存放着普通用户的命令 /boot 启动Linux的核心文件 /data 用户用于存放日志等数据的目录 /dev 系统的设备文件&#xff0c;即设备的驱动程序 /etc 系统所有的配置文件都在这个目录中 /home 用户主目录的基点 /lib 存放着和…...

流量卡是什么?流量卡为什么有虚量,51物联卡带你全面了解一下。

上个月在网上买了一张流量卡&#xff0c;用了之后才发现剩余流量和套餐不符&#xff0c;这种流量是虚的吗&#xff1f;还有必要接着使用吗&#xff1f;这是一个网友跟小编私信咨询的一个问题。 ​ 其实流量卡流量和套餐不符&#xff0c;这个问题是比较常见的一个问题&#xff…...

浅谈电力物联网时代物联网技术在电力系统中的应用

贾丽丽 安科瑞电气股份有限公司 上海嘉定201801 摘要&#xff1a;在电力系统建设中&#xff0c;物联网的应用不仅促进了我国电力工业的发展&#xff0c;而且对我国的物联网技术也起到了一定的促进作用。随着物联网技术应用于电力系统&#xff0c;推动了中国工业的快速发展。因…...

HTTP 状态代码 (Winhttp.h)

文章目录 对开发者有什么帮助状态码产生要求WinHTTP状态码推荐阅读 Microsoft Windows HTTP Services (WinHTTP) 的用户应使用最新版本的技术版本 5.1。 版本 5.0 不再受支持。 对开发者有什么帮助 HTTP状态代码&#xff08;HTTP status codes&#xff09;是Web开发中的标准返…...

浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)

✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义&#xff08;Task Definition&…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好&#xff0c;欢迎来到《云原生核心技术》系列的第七篇&#xff01; 在上一篇&#xff0c;我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在&#xff0c;我们就像一个拥有了一块崭新数字土地的农场主&#xff0c;是时…...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

【AI学习】三、AI算法中的向量

在人工智能&#xff08;AI&#xff09;算法中&#xff0c;向量&#xff08;Vector&#xff09;是一种将现实世界中的数据&#xff08;如图像、文本、音频等&#xff09;转化为计算机可处理的数值型特征表示的工具。它是连接人类认知&#xff08;如语义、视觉特征&#xff09;与…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

聊一聊接口测试的意义有哪些?

目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开&#xff0c;首…...

有限自动机到正规文法转换器v1.0

1 项目简介 这是一个功能强大的有限自动机&#xff08;Finite Automaton, FA&#xff09;到正规文法&#xff08;Regular Grammar&#xff09;转换器&#xff0c;它配备了一个直观且完整的图形用户界面&#xff0c;使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

用机器学习破解新能源领域的“弃风”难题

音乐发烧友深有体会&#xff0c;玩音乐的本质就是玩电网。火电声音偏暖&#xff0c;水电偏冷&#xff0c;风电偏空旷。至于太阳能发的电&#xff0c;则略显朦胧和单薄。 不知你是否有感觉&#xff0c;近两年家里的音响声音越来越冷&#xff0c;听起来越来越单薄&#xff1f; —…...