Mastering Makefile:模块化编程技巧与经验分享
在Linux项目管理中,Makefile是一个强大的工具,它可以帮助我们自动化编译和测试过程。然而,随着项目的增长,Makefile可能会变得越来越复杂,难以管理。在这篇文章中,我将分享一些模块化编程的技巧和经验,帮助你更好地管理你的Makefile。
-
使用反斜杠进行换行
在Makefile中,我们可以使用反斜杠(\)进行换行。这是一个很有用的技巧,可以使我们的Makefile更易读,更易管理。例如:
target: dependencies \command1 \command2 \command3在这个例子中,
command1、command2和command3都是target的命令,尽管它们在不同的行上。只要在行尾添加反斜杠,就可以在下一行继续编写命令。 -
模块化你的Makefile
随着项目的增长,你的Makefile可能会变得越来越大。为了更好地管理它,你可以将它分解成多个模块。每个模块都有自己的目标和依赖项,这样可以使你的Makefile更易读,更易管理。
例如,你可以创建一个名为
compile.mk的Makefile模块,专门用于编译你的代码。然后,在你的主Makefile中,你可以使用include指令来包含这个模块:include compile.mk -
使用变量
在Makefile中,你可以使用变量来存储常用的值。这可以使你的Makefile更易读,更易管理。例如,你可以创建一个变量来存储你的编译器选项:
CFLAGS = -Wall -Werror然后,你可以在你的命令中使用这个变量:
target: dependencies$(CC) $(CFLAGS) -o target dependencies -
使用模式规则
在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.txt和diff 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项目管理中,Makefile是一个强大的工具,它可以帮助我们自动化编译和测试过程。然而,随着项目的增长,Makefile可能会变得越来越复杂,难以管理。在这篇文章中,我将分享一些模块化编程的技巧和经验&…...
el-input输入校验插件(正则表达式)
使用方法:在main.js文件中注册插件然后直接在<el-input>加入‘v-插件名’ (1)在main.js文件: // 只能输入数字指令 import onlyNumber from /directive/only-number; Vue.use(onlyNumber); (2)在src/directive文件夹中 &a…...
【Matplotlib】plt.plot() X轴横坐标展示完整整数坐标
比如说,我的数据应该是 x轴从2到21的20个整数 y轴对应值 但是直接plot的话x轴显示居然有小数点什么鬼 可以这样改...
左手 Jira,右手 Polarion,驶入互联网和制造业十字路口的新能源汽车
笔者之前一直在互联网公司从事软件研发,创立 Bytebase 之后,才开始接触到各行各业的用户。最近来自汽车行业的客户不少,所以就翻翻相关资料。周末微信收到了一条推送,提到汽车行业的软件研发管理,也由此了解到了 Polar…...
网络安全(黑客)-0基础小白自学
1.网络安全是什么 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 2.网络安全市场 一、是市场需求量高; 二、则是发展相对成熟…...
ActiveMQ、RabbitMQ、RocketMQ、Kafka介绍
一、消息中间件的使用场景 消息中间件的使用场景总结就是六个字:解耦、异步、削峰 1.解耦 如果我方系统A要与三方B系统进行数据对接,推送系统人员信息,通常我们会使用接口开发来进行。但是如果运维期间B系统进行了调整,或者推送过…...
unity打AB包,AssetBundle预制体与图集(二)
第二步:加载AB包的资源,用于显示 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中间件常见解析漏洞
一,工具及环境准备 以下都是超详细保姆级安装教程,缺什么安装什么即可(提供镜像工具资源) 1-1 VMware 16.0 安装 【网络安全 --- 工具安装】VMware 16.0 详细安装过程(提供资源)-CSDN博客文章浏览阅读20…...
Python基础——注释、缩进、语法、标识符、关键字
注释 Python中单行注释用#表示,多行注释由3对双引号或单引号包裹:可以使用快捷键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
场景: java程序打成镜像,在rancher上运行,默认是root账户,发现hdfs或者hive不允许root账户操作;所以打算用费root账户启动jar,使其具有hive和hdfs的操作权限。 Dockerfile entrypoint.sh 思路就是上面这样…...
Scrapy使用和学习笔记
前言 Scrapy是非常优秀的一个爬虫框架,基于twisted异步编程框架。yield的使用如此美妙。基于调度器,下载器可以对scrapy扩展编程。插件也是非常丰富,和Selenium,PlayWright集成也比较轻松。 当然,对网页中的ajax请求…...
<sa8650> sa8650介绍
一、sa8650 描述 设备说明 QAM8650P/QAMSRV1H是高通公司的下一代Snapdragon高级驾驶员辅助系统(ADAS)模块,旨在实现卓越的性能和电源效率。 它已被开发为SEooC(上下文之外的安全元素),针对假定的ASIL B用例*。QAM8650P/QAMSRV1H模块的关键组件包括SA8650P/SRV1H SoC、PM…...
[架构之路-244]:目标系统 - 设计方法 - 软件工程 - 软件开发方法:结构化、面向对象、面向服务、面向组件的开发方法
目录 前言: 一、概述: 软件聚合的程度由简单到复杂 二、主要开发方法详见 2.1 结构化的开发方法 2.2 面对对象的开发方法 2.3 面向服务的开发方法 2.4 面向组件的开发方法 三、不同开发方法比较 3.1 结构化开发方法 3.2 面向对象(OOP)开发方法 3.3 面向服…...
Qt窗体自动销毁
Qt中通过对象树的方式,实现了窗体自动析构,只要我们使用得当,就能免去自己去释放窗体对象的内存,但是我们得清楚Qt窗体自动析构的机制,什么情况下能够自动析构,什么情况不能。操作不当的情况可能造成内存泄…...
制造业企业设备管理常见的三个问题及对应的解决方案
当今的市场如同茫茫大海,既充满机遇,也伴随着波动的风险。在现代制造业中,企业常常面临着各种挑战,这些挑战可能妨碍其发展和竞争力。但制造企业往往具备能够解决挑战的能力,借助软件工具的力量,可以更好地…...
linux文件目录
/bin 二进制可执行命令。该目录下存放着普通用户的命令 /boot 启动Linux的核心文件 /data 用户用于存放日志等数据的目录 /dev 系统的设备文件,即设备的驱动程序 /etc 系统所有的配置文件都在这个目录中 /home 用户主目录的基点 /lib 存放着和…...
流量卡是什么?流量卡为什么有虚量,51物联卡带你全面了解一下。
上个月在网上买了一张流量卡,用了之后才发现剩余流量和套餐不符,这种流量是虚的吗?还有必要接着使用吗?这是一个网友跟小编私信咨询的一个问题。 其实流量卡流量和套餐不符,这个问题是比较常见的一个问题ÿ…...
浅谈电力物联网时代物联网技术在电力系统中的应用
贾丽丽 安科瑞电气股份有限公司 上海嘉定201801 摘要:在电力系统建设中,物联网的应用不仅促进了我国电力工业的发展,而且对我国的物联网技术也起到了一定的促进作用。随着物联网技术应用于电力系统,推动了中国工业的快速发展。因…...
HTTP 状态代码 (Winhttp.h)
文章目录 对开发者有什么帮助状态码产生要求WinHTTP状态码推荐阅读 Microsoft Windows HTTP Services (WinHTTP) 的用户应使用最新版本的技术版本 5.1。 版本 5.0 不再受支持。 对开发者有什么帮助 HTTP状态代码(HTTP status codes)是Web开发中的标准返…...
JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...
Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...
BLEU评分:机器翻译质量评估的黄金标准
BLEU评分:机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域,衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标,自2002年由IBM的Kishore Papineni等人提出以来,…...
在 Spring Boot 中使用 JSP
jsp? 好多年没用了。重新整一下 还费了点时间,记录一下。 项目结构: pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...
Vue ③-生命周期 || 脚手架
生命周期 思考:什么时候可以发送初始化渲染请求?(越早越好) 什么时候可以开始操作dom?(至少dom得渲染出来) Vue生命周期: 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...
【UE5 C++】通过文件对话框获取选择文件的路径
目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 ,这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器,右键点击 .uproject 文件,选择 "Generate Visual Studio project files",重…...
