什么是makefile

Makefile(简单入门) Makefile学习记录 阅读详情

1什么是Makefile

         在之前学习C程序的编译过程中,我们知道编译一个程序还比较简单, 如果要编译多个文件,或者不同文件夹中的文件,需要生成不同的库文件,以及确定这些文件的编译先后顺序,往往所需要的命令行特别多,而且比较复杂,甚至对于以后项目的维护也比较麻烦。

    再想想如果我们需要编译Linux内核这样好几W个文件的项目难道需要我们一个命令的输入吗 ? 那估计是一场噩梦。

图片

    那么这个时候如果我们能够把所有的编译规则全部规范到文件中,然后通过解析该文件去执行对应的编译指令,这样就大大简化指令的复杂度,同时降低了编译程序过程中所带来的错误。

    根据上面的需求就产生了Makefile,我们的编译和处理规则就放在Makefile文件中,通过Makefile工具解析Makefile文件中的命令来指导整个工程的编译过程。

图片

    当然Makefile文件中的命令书写是有一定的规范的,这也是今天我们所要讲到的重点,一旦该文件编写好以后在Linux命令行中执行一条make命令即可自动编译整个工程,不但提高了开发效率也便于后期维护。

    当然不同厂家的make稍有不同,并且语法上也有点区别,不过基本思想都差不多,主要还是落在目标依赖上来,这里以最广泛的GNU Make跟大家讲解。

2Makefile文件基本规则

图片

    上面的为大家展示了Makefile的核心规则,有点类似于一位厨师做菜,目标就是做一碗好菜,那么所谓的依赖就是各种食材、各种厨具等等,然而有了这些依赖还不够需要厨师有着非常好的厨艺才能做出一道好菜。

图片

    同时这些依赖也有可能此时此刻并不存在,需要现场制作,或者由其他厨师做好,那么这个依赖就成为了其他规则的目标,该目标也会有它自己的依赖和命令,这样形成一层一层递归依赖组成了Makefile文件。

图片

总结

  • Makefile并不会关心命令是如何执行的,仅仅只是会去执行所定义的命令,和我们平时直接输入命令行是一样的效果。

  • Makefile就相当于一个依赖关系文件,在执行该文件的以后会递归的查找依赖文件并执行对应的命令,最终生成第一个目标

3简单使用Makefile

    下面小哥就之前代码简单演示一下Makefile:

图片

    上图是makefile文件,最终为了生成Test文件,需要三个*.o文件,然后三个.o文件又分别依赖于对应的*.c文件,这样加上对应的gcc命令就构成了一个基本的makefile。

    注意 : 2/4/6/8行均为tab键。

    下面使用make命令来编译生成test目标文件

图片

    这样我们执行make命令一键就搞定了所有的编译任务,如果下次需要改变编译过程就直接修改对应的makefile文件中的规则即可。

    有类比过windows里面IDE环境中编译器使用的小伙伴都知道在windows里面的开发工具编译通过一键即可搞定所有编译内容。难道windows中的开发工具更强大一些?

    其实不然,我们在windows中构建对应的工程文件的过程中通过图形界面就悄悄的把类似的makefile文件给生成了,那么当点击编译的时候就相当于在命令行里面执行make,其实都是类似的,仅仅只是我们平时使用windows更多一点,更加容易接受。

   当然这里仅仅只是演示了一些最简单的操作,比较麻烦的还是命令部分可以使用到通配符和shell指令等等,这样会增加一定的复杂度,其实makefile本身并没有太大的难度

1指定使用Makefile文件

    在命令行中使用make命令,makefile会在默认路径中查找对应的makefile文件来进行工程管理,我们一般把对应的makefile文件名命名为Makefile和makefile等,如果名字不匹配可能无法找到对应的makefile文件,比如:

图片

makefile文件名

图片

Makefile文件名

图片

MAKEFILE文件名-编译失败

   从上面的实验现象可以了解到make会查找默认的makefile文件名,如果没有找到规定的文件名就会报相应的故障。

    不过如果平时在一个目录下存在多个makefile文件的时候,一般我们都会通过不同命名来进行区分,那么该如何指定对应的makefile文件进行识别解析呢 ?可以使用make -f选项,如下图所示:

图片

2注释文本

 

    在开发过程中存在需要注释掉makefile文件相应文本行可以在文件的行首使用#号:

图片

    上面是正常进行makefile编译目标文件的完整实例,并且输出了正确的结果,然后小哥使用#号屏蔽掉前面两行,如下图所示:

图片

    继续执行make命令,根据makefile的规则,会默认编译Test1.o目标文件:

图片

    这样我们获得了正确的结果,说明注释生效。

3取消回显文本

     在makefile使用过程中默认是会把相应的处理过程信息进行回显,这样能够让开发者更好的了解makefile的处理过程.

    不过,如果回显信息非常的庞大也是不利于开发者分析的,所以编辑人员可以使用@来取消相关信息的回显,如下图所示:

图片

在命令tab键后加入@

图片

    这里我们可以看到使用make以后没有像之前使用的makefile文件那样存在回显的命令行信息了。

4伪目标的使用

    在makefile文件中有时候执行一些不需要有依赖命令的目标,称为伪目标。

图片

    上面是对应的makefile文件,其中里面加入伪目标clean,通过使用.PHONY修饰,这样可以直接使用make clean 来执行对应的命令。

图片

    上面执行make clean确实执行了清除操作。

5变量的使用

    在makefile中为了减少代码的重复,使用变量的概念来简化编写,如下面的makefile进行如下改造:

图片

    使用$(obj)来代替所有的目标文件,以后需要添加其他目标文件的话就只需要在变量obj处进行相应修改即可。

    同时系统还存在其他默认的自动化变量,这样可以大大简化makefile文件,便于设计和后期维护,如:

  • $^    表示所有的依赖文件

  • $@    表示生成的目标文件

  • $<    代表第一个依赖文件

  • 等等    

    makefile基础知识点小哥暂时就讲到这里,其实大部分工程项目自己完完全全编写的并不是很多,更多的修修改改,所以遇到了具体的疑问在进行查找或许效率更高。

Makefile命令参数、调用其他Makefile、嵌套 介绍make运行参数和调用其他makefile 阅读详情

相关推荐

《Makefile 进阶之路一》 这里有你对Makefile所有的畅想

make在执行这个规则所定义的命令之前,首先处理目标“edit”的所有的依赖文件(例子中的那些.o 文件)的更新规则(以这些.o 文件为目标的规则)。这些.o 文件所在的规则之所以会被执行,是因为这些.o 文件出现在“终极目标”的依赖列表中。在 Makefile 中一个规则的目标如果不是“终极目标”所依赖的(或者“终极目标”的依赖文件所依赖的),那么这个规则将不会被执行,除非明确指定执行这个规则(可以通过 make 的命令行指定重建目标,那么这个目标所在的规则就会被执行,例如 “make clean”)。

2401_83974607的博客 708

Makefile入门(超详细一文读懂)

1、Makefile基本格式 1、语法规则 目标 ... : 依赖 ... 命令1 命令2 . . . 1、目标即要生成的文件。如果目标文件的更新时间晚于依赖文件更新时间,则说明依赖文件没有改动,目标文件不需要重新编译。否则会进行重新编译并更新目标文件。 2、默认情况下Makefile的第一个目标为终极目标。 3、依赖:即目标文件由哪些文件生成。 4、命令:即通过执行命令由依赖文件生成目标文件。注意每条命令之前必须有一个tab保持缩进,这是语法要求(会有一些编辑工具默认tab为4个空格,会造成Mak

ZBraveHeart的博客 14万+

保姆级教程:在RK3568上调试RGMII网口,从设备树到PHY驱动的完整避坑指南

本文提供RK3568开发板上RGMII网口调试的完整指南,涵盖硬件检查、设备树配置、驱动加载及性能优化。通过详细步骤和实战案例,帮助开发者避开常见陷阱,确保以太网功能稳定运行,特别关注PHY驱动和MDIO总线的调试技巧。

weixin_26821003的博客 320

makefile详解

一、初识makefile 想要掌握makefile,首先需要了解两个概念,⼀个是⽬标(target),另⼀个就是依赖(dependency)。⽬标就是指要⼲什么,或说运⾏ make 后⽣成什么,⽽依赖是告诉 make 如何去做以实现⽬标。在 Makefile 中,⽬标和依赖是通过规则(rule)来表达的。 (一)、目标 首次编写makefile all: echo "Hello world" 上面Makefile 中的 all 就是我们 的⽬标,⽬标放在‘:’的前⾯,其

Chocolate的博客 6496

ArcGIS+PLUS+InVEST三件套实战:从零搞定土地利用变化与碳储量预测(附完整数据包)

本文详细介绍了如何整合ArcGIS、PLUS模型和InVEST模型,构建土地利用变化与碳储量预测的完整研究流水线。通过多情景模拟和生态系统服务评估,提供从数据准备到结果验证的实战指南,助力研究者高效完成生态评估项目。

weixin_30399821的博客 541

基于ESP32的气象雷达站设计与实现

物联网技术通过嵌入式设备实现环境数据的实时采集与可视化,其中ESP32凭借其双核处理器和WiFi/蓝牙功能成为热门选择。本项目利用ESP32结合LVGL图形库,构建了一个低成本气象监测系统,通过OpenWeatherMap API获取全球气象数据并在7英寸触摸屏上动态展示。系统采用三级优化策略处理高分辨率雷达图,包括服务端预处理、硬件加速解码和显示增强,有效解决了内存占用和帧率问题。在物联网设备开发中,类似方案可应用于智能家居、农业监测等场景,特别是需要实时数据可视化的领域。通过SPIFFS存储和zlib压

weixin_42524864的博客 422

Makefile(超详细一文读懂)

make: 默认会编译源文件,生成可执行文件app。make clean: 清理编译生成的对象文件和可执行文件。以下是一个简单的Makefile示例,适用于一个包含多个源文件的 C++ 项目。project/Makefile# CompilerCXX = g++%.o: %.cppclean:CXX = g++CXX = g++: 定义了编译器使用g++。: 设置编译选项:-Wall: 启用所有常见的编译警告,有助于发现潜在的错误。-std=c++17: 指定使用 C++17 标准。

qq_51753728的博客 5万+

Halcon窗体开发避坑指南:C#自定义控件实现7大图像交互功能

本文详细介绍了如何利用C#封装自定义Halcon控件,以解决原生HWindowControl功能不足的问题。通过实战代码,展示了如何实现图像按比例显示、鼠标拖动缩放、灰度值读取、图像保存、截图及图形叠加等七大核心交互功能,并重点剖析了内存管理、坐标转换等开发避坑要点,帮助开发者构建稳定可复用的机器视觉组件库。

weixin_29251131的博客 292

【makefile入门】makefile选项和makefile.buil

学习makefile的常用选项,并通过一个案例来学习makefile.build

jk_lovers的博客 2077

ThinkBook 16 2024 Ubuntu驱动全攻略:从无线网卡到触控板

本文详细介绍了ThinkBook 16 2024在Ubuntu系统下的驱动问题解决方案,涵盖无线网卡、蓝牙、显卡和触控板等关键硬件的驱动修复步骤。通过具体命令和配置指南,帮助用户快速解决兼容性问题,提升Ubuntu在ThinkBook上的使用体验。

weixin_29200741的博客 825

WD西部数据2TB,2.5寸移动硬盘,因为磁头坏了,长时间通电导致划片划伤,维修过程通过反复更换磁头

WD西部数据2TB,2.5寸移动硬盘,因为磁头坏了,长时间通电导致划片划伤,维修过程通过反复更换磁头,才能利用专业设备,里面找到,镜像,把内容数据恢复出来。 1.说一下经历,借用的别人移动硬盘,去帮别人维修,拷数据出来,别人的文件,数据比较多,且复杂,而且是在PE系统,接口什么的是2.0,没有很好的思考就全选复制拷贝了; 2,拷贝的过程,极其慢,文件多,且文件有损坏,移动硬盘一直处于通电的状态,大概从下午,两点多开始100多G的数据,一直卡住,到,晚上7 。8点拷完还是没拷完。打开的时候就已经,就一直

weixin_43766920的博客 4301

Makefile文件:Makefile介绍

本文介绍Makefile的一些基本概念以及简单的用法。本文所用的编译器是Hightec tricore v4.9.1.0。 文章目录1 Makefile的作用2 Makefile的规则3 一个简单的Makefile3.1 帮助文档中的例子3.2 例程1:一个简单的Makefile 1 Makefile的作用 简单来说,Makefile的作用是告诉make如何编译和链接程序。我们在Eclipse界面中写好代码后,会点击一下rebuild按钮来将工程重新编译和链接。这背后就是通过Makefile来实现的。本文博

u013288925的博客 2872

手眼标定(EyeToHand)推导

Base为基坐标系(B),工具末端坐标系(T),标定板为Mark坐标系(M),相机坐标系(C)对于每两个姿态都存在上式,组成一个AX=XB的矩阵方程,X为。此时转换成AX=0的问题,单纯用SVD求奇异解便可得到。相机坐标系到Base基坐标系下的转换关系。已知标定板与机械臂末端的相对位置固定不变,,即。带入(2)式求,至此求解出需要的手眼矩阵。在眼在手外的时候,其实是要求解。

stevenreally6的博客 1142

makefile使用MAKEFILE_LIST获取inlcude文件所在的目录

文章目的 记录下MAKEFILE_LIST的获取目录的使用技巧 测试目录 |----Makefile |----test01 |----test.txt |----001 |----test.txt |----test02 |----test.txt |----002 |----test.txt makefile 文件 #inlcue获取路径技 pkgdir ...

mjLlm的博客 2142

雷达参数的设置

采样率又可以叫做采样速率或者,顾名思义就是每秒采集的次数。该值越高,单位时间内对信号的采集越多,采样率的单位可以用Hz或者sps表示(sps是采样率,是每秒采样点的数量,sp表示采样点数),一般1sps=1Hz。采样时间是采样点数和采样周期的乘积得到的结果。假设实际采样率为4560ksps,采样点数为256,那么采样周期为1/4560(ms),那么ADC的采样时间就为256*(1/4560)(ms)=0.056ms=56微秒。

qq_50974341的博客 1911

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

【Linux】Makefile

Makefile是一个包含了一系列指令的文件,这些指令定义了如何编译和链接程序。Makefile被make命令使用,make是一个构建自动化工具,它根据Makefile中定义的规则来决定哪些文件需要重新编译。

Tesseract_9527的博客 1451

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Makefile 变量MAKEFILE_LIST

make程序在读取多个makefile文件时,包括由环境变量“MAKEFILES”指定、命令行指定、当前工作下的默认的以及使用指示符“include”指定包含的,在这些文件进行解析执行之前make读取的文件名将会被自动依次追加到变量“MAKEFILE_LIST”的定义域中。 这样我们就可以通过测试此变量的最后一个字来获取当前make程序正在处理的makefile文件名。具体的说就是在一个makefile文件中如果使用指示符“include”包含另一个文件之后,变量“MAKEFILE_LIST”的最后一个字只

肥叔菌的博客 8570

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Makefile中获取当前执行的Makefile所在路径

Linux下我们可以用pwd命令来获取当前所执行命令的目录,在Makefile中对应可用PWD := $(shell pwd)来获取。但是如果子Makefile 文件是从别处执行的(通过make -f .../Makefile 执行),那么$(shell pwd)得到的目录即为执行make -f命令的当前目录。在这种情况下, Makefile本身里面的命令不能对当前目录作出假设.那么如何获取被

专注探索c++,Linux等后台开发相关机制,欢迎关注,欢迎交流 2万+

Makefile.am和makefile.in生成Makefile

Makefile.am和makefile.in生成Makefile

Bendawang's Blog 2万+

【Makefile】简单的Makefile编写

Makefile编写 程序的编译和链接 使用C、C++编写可执行文件,首先要把源文件编译成中间代码文件,Linux下是.o文件,即Object File,这个动作叫做编译(complie)。 然后再把大量的Object File合成执行文件,这个动作叫链接(link)。 一个项目会拥有成百上千个源程序文件,再使用G++ or GCC会很麻烦。于是Makefile闪亮登场。 Makefile确定整个工程的编译规则,只需要一个make命令,就可以实现“自动化编译”。 make是一个解释Makefile

半生瓜のblog 3470

Android Makefile分析

随着移动互联网的发展,移动开发也越来越吃香了,目前最火的莫过于android,android是什么就不用说了,android自从开源以来,就受到很多人的追捧。当然,一部人追捧它是因为它是Google开发的。对一个程序 员来说,一个系统值不值得追捧得要拿代码来说话。我这里并不打算分析android的代码,而是android的makefile,也许大家已经知道了在android源码里,我们可以看见很

andy_android的专栏 1万+

makefile, makefile.am 与makefile.in的联系

前言 依旧是这两周的任务,这篇主要是关于开源项目的Makefile。在已有代码基础上,进行功能扩展,增加.c/.h文件以及链接需要的线程库。这就牵涉到对Makefile的修改。好吧,刚开始接触,满版的各种变量与正则,表示相当纠结,然后很天真的想去看明白。。。之后,在网上就这个问题查了查资料,然后动手实验下,在此记录并感谢原文博主。 原文:Makefile Makefile.am Makefil...

fhb1922702569的博客 3676

QT Makefile分析

目录QT项目的手动编译过程Makefile中的关键点Makefile参考 QT项目的手动编译过程 使用qmake -project 生成 .pro工程文件 修改.pro,添加依赖的模块,例如“QT += widgets" make #这个过程会将.ui这个xml文件通过uic转换成c++语言文件,然后用g++编译链接,最终生成target。 Makefile中的关键点 第一个目标是make默...

travellers的专栏 1840
上一篇: Makefile入门
下一篇: linux内核内存空间申请kmalloc kzalloc和vmalloc的区别
土豆西瓜大芝麻
博客等级 码龄18年 1189粉丝 238原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值