[Linux] 项目自动化构建工具-make/Makefile

news2024/9/23 3:13:57

标题:[Linux] 项目自动化构建工具-make/Makefile

@水墨不写bug



目录

一、什么是make/makefile

二、make/makefile语法

补充(多文件标识):

三、make/makefile原理

四、make/makefile根据时间对文件选择操作


正文开始:

一、什么是make/makefile

        在Linux下,一切皆文件。在实现大型项目的时候,通常来说,源文件按照其模块、功能、类型放在若干的目录中,难道我们需要把这些文件一一编译再链接吗?为了提高效率,make/makefile就出现了。

        makefile可以按照我们写好的规则来完成自动化编译,一旦项目内容有修改,仅需几条指令,就可以实现整个工程的完全自动化编译,这极大对提高了软件开发的效率。

一句话定义make/makefile:make是一个指令;makefile是一个文件

        我们要做的就是在makefile中编写相关的指令,可以说是提前写好的脚本,当我们需要的时候,再执行相关的命令。 

二、make/makefile语法

        makefile怎么写?

        首先,在执行命令之前,需要表明依赖关系。什么是依赖关系?可以简单的理解为一个文件的生成需要另一个文件存在。

        然后,需要说明依赖方法。 依赖方法就是用命令表明要做的事。

表明依赖关系:在一行的开头写 目标生成文件 +:(冒号)+依赖的文件

        比如:mytest文件需要依赖test.c,则需要表明依赖关系:

mytest:test.c 

        紧接着在下一行,开始需要加一个 “tab”字符,必须是“tab”,其他的都不行。在其后加上依赖方法。这里的依赖方法就是用test.c生成mytest的指令:

gcc -o mytest test.c

 现在,我们已经完成了生成项目,接下来还需要清理项目。清理项目仍然需要用到依赖关系。

        我们一般把清理项目的指令设为clean,由于clean不依赖任何文件,所以:(冒号)的右侧不写任何文件:

clean:

        同样的,在下一行开头“tab”,其后加上依赖方法:

rm -r mytest

         到这里,我们就完整实现了一个简单的makefile。


整体的makefile如下:

mytest:test.c
    gcc -o mytest test.c
clean:
    rm -r mytest

        在完整实现makefile之后,我们就可以在含有makefile的目录下使用make命令:

make

        make命令会根据依赖关系的依赖方法,从而令makefile文件的内容而生成mytest;

        如果想要清理mytest,使用命令:

make clean

        make clean会根据 依赖方法,清除mytest。

补充(多文件标识):

        如果一个文件有多个依赖文件,则在“:”后面以此写上文件名即可,文件之间用一个空格分开。而在表明依赖方法的时候,就不必再一个一个写文件名称了,可以用简写标识:

$@   :标识 “:”左侧的目标文件

$^     :标识“:”右侧的所有依赖文件

于是,针对多依赖文件的依赖关系就可以这样写:

gcc -o $@ $^

三、make/makefile原理

        1. make会在当前目录下找名字叫“Makefile”或“makefile”的文件。(首字符不区分大小写)

        2. 如果找到,它会找文件中的第一个目标文件(target),一般来说,我们会把目标文件(最终文件)放在第一个位置,然后倒推生成目标文件需要依赖的其他文件,一直推到已存在的文件为止。

比如下面这个makefile例子:

my_test:my_test.o
     g++ -o my_test my_test.o
my_test.o:my_test.s
     g++ -c my_test.s -o my_test.o
my_test.s:my_test.i
     g++ -S my_test.i -o my_test.s
my_test.i:test.cpp
     g++ -E test.cpp -o my_test.i

       我们首先发现目标文件my_test,其依赖文件为my_test.o,而my_test.o又依赖my_test.s,但是还没有推到已知的test.cpp,所以要继续寻找;my_test.s依赖my_test.i,而my_test.i就可以由test.cpp生成,test.cpp是已经存在的文件,所以推导结束,并且没有推导过程中的逻辑中断,所以上述的makefile文件是正确的。

        在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make根本不理。

        这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。(这有点像一个堆栈的过程)

四、make/makefile根据时间对文件选择操作

        当我们在一个项目中make一次之后,再次make,会发现出现这样的错误:

        这个名字叫做“processbar”的项目已经是最新的了。想要理解为什么会发生这样的错误,我们需要理解每一个文件都有三个时间:

Access time

Modify time

Change time

        这三个时间分别是:最后一次访问文件的时间, 最后一次修改文件内容的时间,最后一次修改文件属性的时间。

访问文件:这比较好理解,比如读取文件,打开文件看文件的内容等;

修改文件:

        修改文件分为修改文件的内容修改文件的属性。我们知道,文件有内容(就是我们通常写入的数据)和属性(比如文件的大小,创建时间,文件类型,所有者等)。

        make会根据项目最终文件和源文件的最近修改时间来决定是否要重新编译生成项目文件:

        如果项目最终文件的修改时间比源文件的时间晚,那么说明源文件在编译生成项目文件之后没有修改过,这时make就会出现上述的报错;如果项目最终文件的修改时间比源文件早,那么说明源文件在编译生成项目文件之后源文件修改过,这时make就可以重新编译生成项目文件。

        如果想要不受上述的时间的限制,从而实现在每次make之后都重新编译生成项目文件,我们就需要定义伪目标

        具体的操作为在表明依赖关系之前用 ".PHONY"修饰目标文件。

        一般而言,我们一般不会把最终项目定义为伪目标,一般选择把clean定义为伪目标,这样一来,在每次想要clean的时候,总是可以成功执行clean:

修改后的makefile:

processbar:processbar.c main.c                                                                                      
    gcc -o $@ $^
.PHONY:clean
clean:
    rm -f processbar

完~

未经作者同意禁止转载

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于SpringBoot的校园闲置物品租售系统

你好呀,我是计算机学姐码农小野!如果有相关需求,可以私信联系我。 开发语言:Java 数据库:MySQL 技术:SpringBootMyBatis 工具:IDEA/Eclipse、Navicat、Maven 系统展示 首页 用户管理界面 …

华为云征文|Flexus云服务X实例应用,通过QT连接华为云MySQL,进行数据库的操作,数据表的增删改查

引出 4核12G-100G-3M规格的Flexus X实例使用测评第3弹:Flexus云服务X实例应用,通过QT连接华为云MySQL,进行数据库的操作,数据表的增删改查 什么是Flexus云服务器X实例 官方解释: Flexus云服务器X实例是新一代面向中…

【python】如何用python代码快速生成二维码

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

【算法思想·二叉树】思路篇

本文参考labuladong算法笔记[东哥带你刷二叉树(思路篇) | labuladong 的算法笔记] 本文承接 【算法思想二叉树】纲领篇,先复述一下前文总结的二叉树解题总纲: 二叉树解题的思维模式分两类: 1、是否可以通过遍历一遍二…

数据结构——单链表相关操作

zhuzhu1、结构框图: 2、增删改查: 定义链表节点和对象类型 /*************************************************************************> File Name: link.h> Author: yas> Mail: rage_yashotmail.com> Created Time: Tue 03 Sep 2024…

ServiceStage集成Sermant实现应用的优雅上下线

作者:聂子雄 华为云高级软件工程师 摘要 优雅上下线旨在确保服务在进行上下线操作时,能够平滑过渡,避免对业务造成影响,保证资源的高效利用。Sermant基于字节码增强的技术实现了应用优雅上下线能力,应用发布与运维平…

摩博会倒计时!OneOS操作系统抢先了解!

2024年第二十二届中国国际摩托车博览会(摩博会)临近,中移物联OneOS与智能硬件领域佼佼者恒石智能宣布强强合作,与9月13日至16日在重庆国家会展中心共同展现多款Model系列芯片(Model3、Model4、Model3C、Model3A&#x…

I2C软件模拟时序的基本要素

目录 前言 一、关于I2C 二、正文 1.引脚的配置 2.I2C的起始和终止时序 3.发送一个字节 4.接收一个字节 5.应答信号 6.指定地址写和指定地址读 总结 前言 环境: 芯片:STM32F103C8T6 Keil:V5.24.2.0 本文主要参考江科大教程&#…

系统架构师考试学习笔记第三篇——架构设计高级知识(11)软件可靠性基础知识

本章知识点: 第11课时主要学习软件可靠性基本概念、建模、管理、设计、测试和评价等内容。本课时内容侧重于概念知识,根据以往全国计算机技术与软件专业技术资格(水平)考试的出题规律,考查的知识点多来源于教材,扩展内容较少。根据考试大纲,本课时知识点会涉及单项选…

注册安全分析报告:央视网

前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞…

day47——面向对象特征之继承

一、继承(inhert) 面向对象三大特征:封装、继承、多态 继承:所谓继承,是类与类之间的关系。就是基于一个已有的类,来创建出一个新类的过程叫做继承。主要提高代码的复用性。 1.1 继承的作用 1> 实现…

16、修改Markdown Preview Enhanced默认样式

前言 vscode的markdown preview enhanced插件的主题并不一定符合每个人的审美,所以有的时候需要自定义,笔者根据网上大佬的文章整合了下自定义修改Markdown Preview Enhanced默认样式的方法,模板在文章中,大家可以直接使用,希望能…

【数据结构】反射,枚举你必须知道的相关知识

前言: 🌟🌟本期讲解关于反射以及枚举,希望能帮到屏幕前的你。 🌈上期博客在这里:http://t.csdnimg.cn/7D225 🌈感兴趣的小伙伴看一看小编主页:GGBondlctrl-CSDN博客 目录 &#x1f…

获得并修改硬件序列号--CPU、主板、内存、硬盘等(有源码)

大家都知道很多Anti Cheat会封硬件序列号,所以本文探索一下如何get and modify序列号。 这个服务是比较贵的: 于是有了研究一下的想法。 思路: 1. 通过厂商自带的程序刷新固件。 2. 自己写驱动修改。 思路1不讨论,要拿到厂商去修改,很不方…

台球助教陪练预约系统源码开发

随着科技的发展和人们对生活质量要求的提高,体育运动的数字化趋势日益明显。台球作为一种集休闲娱乐与竞技于一体的运动项目,在全球范围内拥有广泛的爱好者群体。为了更好地满足这部分人群的需求,开发一个高效的台球助教陪练预约系统变得尤为…

国家超算互联网入选国家数据局“全国一体化算力网应用优秀案例”

在2024年8月29日举行的中国国际大数据产业博览会上,国家数据局公布了首批“全国一体化算力网应用优秀案例”。 这一举措是在经过严格的评审过程后,挑选了包括“国家超算互联网”在内的25个创新平台和方案,它们代表了当前算力网建设的先进与创…

【ssh】环境问题汇总

问题1.同时显示两个不同的 Conda 环境,如图 (base) 环境 是 Conda 安装后默认激活的环境。 (ani) 是手动创建的另一个 Conda 环境。 解决:执行conda deactivate。如果 (ani) 环境多次激活,需要多次执行 conda deactivate 才能回到 base 环境…

【论文分享】sNPU: Trusted Execution Environments on Integrated NPUs 24‘ISCA

目录 AbstractINTRODUCTIONBACKGROUND AND RELATED WORKTrusted Execution Environment (TEE)Neural Processing Unit (NPU)Integrated NPU v.s. Discrete NPU Multi-tasking Requirements for NPUsLow NPU utilization for a single ML workloadSimultaneous execution of bot…

jquery swiper插件的用法

一、Swiper插件简介 Swiper是一个纯JavaScript打造的滑动特效插件,面向手机、平板电脑等移动终端,同时也支持桌面浏览器。Swiper开源、免费、稳定、使用简单且功能强大,是架构移动终端网站的重要选择。 它支持触摸滑动、响应式设计、循环滑动…

基于Java+SpringBoot+Vue+MySQL的地方美食分享网站

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 基于SpringBootVue的地方美食分享网站【附源码文档】、前后…