Linux应用编程之"一文搞定Makefile"(上)

一口Linux 2020-11-27 00:00


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


  

从0学ARM专辑汇总

  0. 到底什么是Cortex、ARMv8、arm架构、ARM指令集、soc?一文帮你梳理基础概念【科普】

  1. 从0开始学ARM-安装Keil MDK uVision集成开发环境


  2. 从0开始学ARM-CPU原理,基于ARM的SOC讲解




  3. 从0开始学ARM-ARM模式、寄存器、流水线



推荐阅读


【1】Linux面试题100道,看看会多少?
【2】 Modbus协议概念最详细介绍 必读
【3】 I2C基础知识入门
【4】如何用C语言操作sqlite3,一文搞懂
【5】 又一华为程序员进了ICU:压垮一个家庭,一张结算单就够了! 必读

 

进群,请加一口君微信,带你嵌入式入门进阶。

 


点击“阅读原文”查看更多分享,欢迎点分享、收藏、点赞、在看


    

一口Linux 写点代码,写点人生!
评论
  • 应用环境与极具挑战性的测试需求在服务器制造领域里,系统整合测试(System Integration Test;SIT)是确保产品质量和性能的关键步骤。随着服务器系统的复杂性不断提升,包括:多种硬件组件、操作系统、虚拟化平台以及各种应用程序和服务的整合,服务器制造商面临着更有挑战性的测试需求。这些挑战主要体现在以下五个方面:1. 硬件和软件的高度整合:现代服务器通常包括多个处理器、内存模块、储存设备和网络接口。这些硬件组件必须与操作系统及应用软件无缝整合。SIT测试可以帮助制造商确保这些不同组件
    百佳泰测试实验室 2024-12-12 17:45 84浏览
  • 全球智能电视时代来临这年头若是消费者想随意地从各个通路中选购电视时,不难发现目前市场上的产品都已是具有智能联网功能的智能电视了,可以宣告智能电视的普及时代已到临!Google从2021年开始大力推广Google TV(即原Android TV的升级版),其他各大品牌商也都跟进推出搭载Google TV操作系统的机种,除了Google TV外,LG、Samsung、Panasonic等大厂牌也开发出自家的智能电视平台,可以看出各家业者都一致地看好这块大饼。智能电视的Wi-Fi连线怎么消失了?智能电
    百佳泰测试实验室 2024-12-12 17:33 77浏览
  • 铁氧体芯片是一种基于铁氧体磁性材料制成的芯片,在通信、传感器、储能等领域有着广泛的应用。铁氧体磁性材料能够通过外加磁场调控其导电性质和反射性质,因此在信号处理和传感器技术方面有着独特的优势。以下是对半导体划片机在铁氧体划切领域应用的详细阐述: 一、半导体划片机的工作原理与特点半导体划片机是一种使用刀片或通过激光等方式高精度切割被加工物的装置,是半导体后道封测中晶圆切割和WLP切割环节的关键设备。它结合了水气电、空气静压高速主轴、精密机械传动、传感器及自动化控制等先进技术,具有高精度、高
    博捷芯划片机 2024-12-12 09:16 93浏览
  • 习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习笔记&记录学习习笔记&记学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记
    youyeye 2024-12-12 10:13 55浏览
  • 本文介绍瑞芯微RK3588主板/开发板Android12系统下,APK签名文件生成方法。触觉智能EVB3588开发板演示,搭载了瑞芯微RK3588芯片,该开发板是核心板加底板设计,音视频接口、通信接口等各类接口一应俱全,可帮助企业提高产品开发效率,缩短上市时间,降低成本和设计风险。工具准备下载Keytool-ImportKeyPair工具在源码:build/target/product/security/系统初始签名文件目录中,将以下三个文件拷贝出来:platform.pem;platform.
    Industio_触觉智能 2024-12-12 10:27 90浏览
  • 习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习笔记&记录学习习笔记&记学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记
    youyeye 2024-12-11 17:58 94浏览
  • 首先在gitee上打个广告:ad5d2f3b647444a88b6f7f9555fd681f.mp4 · 丙丁先生/香河英茂工作室中国 - Gitee.com丙丁先生 (mr-bingding) - Gitee.com2024年对我来说是充满挑战和机遇的一年。在这一年里,我不仅进行了多个开发板的测评,还尝试了多种不同的项目和技术。今天,我想分享一下这一年的故事,希望能给大家带来一些启发和乐趣。 年初的时候,我开始对各种开发板进行测评。从STM32WBA55CG到瑞萨、平头哥和平海的开发板,我都
    丙丁先生 2024-12-11 20:14 81浏览
  • 在智能化技术快速发展当下,图像数据的采集与处理逐渐成为自动驾驶、工业等领域的一项关键技术。高质量的图像数据采集与算法集成测试都是确保系统性能和可靠性的关键。随着技术的不断进步,对于图像数据的采集、处理和分析的需求日益增长,这不仅要求我们拥有高性能的相机硬件,还要求我们能够高效地集成和测试各种算法。我们探索了一种多源相机数据采集与算法集成测试方案,能够满足不同应用场景下对图像采集和算法测试的多样化需求,确保数据的准确性和算法的有效性。一、相机组成相机一般由镜头(Lens),图像传感器(Image
    康谋 2024-12-12 09:45 98浏览
  • 一、SAE J1939协议概述SAE J1939协议是由美国汽车工程师协会(SAE,Society of Automotive Engineers)定义的一种用于重型车辆和工业设备中的通信协议,主要应用于车辆和设备之间的实时数据交换。J1939基于CAN(Controller Area Network)总线技术,使用29bit的扩展标识符和扩展数据帧,CAN通信速率为250Kbps,用于车载电子控制单元(ECU)之间的通信和控制。小北同学在之前也对J1939协议做过扫盲科普【科普系列】SAE J
    北汇信息 2024-12-11 15:45 119浏览
  • 时源芯微——RE超标整机定位与解决详细流程一、 初步测量与问题确认使用专业的电磁辐射测量设备,对整机的辐射发射进行精确测量。确认是否存在RE超标问题,并记录超标频段和幅度。二、电缆检查与处理若存在信号电缆:步骤一:拔掉所有信号电缆,仅保留电源线,再次测量整机的辐射发射。若测量合格:判定问题出在信号电缆上,可能是电缆的共模电流导致。逐一连接信号电缆,每次连接后测量,定位具体哪根电缆或接口导致超标。对问题电缆进行处理,如加共模扼流圈、滤波器,或优化电缆布局和屏蔽。重新连接所有电缆,再次测量
    时源芯微 2024-12-11 17:11 123浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦