Makefile文件:Makefile介绍

article/2025/10/2 19:34:25

本文介绍Makefile的一些基本概念以及简单的用法。本文所用的编译器是Hightec tricore v4.9.1.0。

文章目录

  • 1 Makefile的作用
  • 2 Makefile的规则
  • 3 一个简单的Makefile
    • 3.1 帮助文档中的例子
    • 3.2 例1:一个简单的Makefile
  • 4 make是如何执行Makefile的
    • 4.1 默认目标
    • 4.2 例2:使用默认目标
  • 5 使用变量让Makefile更简洁
    • 5.1 变量的简单用法
    • 5.2 例3:在Makefile中使用变量
  • 6 通过make推导规则
    • 6.1 隐式规则
    • 6.2 例4:省略源文件
  • 7 另一种风格的Makefile
  • 8 清空路径的规则
  • 9 总结

1 Makefile的作用

简单来说,Makefile的作用是告诉make如何编译和链接程序。我们在Eclipse界面中写好代码后,会点击一下rebuild按钮来将工程重新编译和链接,这背后就是通过Makefile来实现的。本文会结合编译器的帮助文档make.pdf,并且自己编写Makefile,来学习Makefile的基本概念和用法。

2 Makefile的规则

Makefile的规则如下所示:
在这里插入图片描述
其中的含义如下:

  1. target是生成的文件的名称,可以是编译器生成的目标文件,或者链接器生成的可执行文件。另外也可以是执行的动作,例如clean;
  2. prerequisite是用于生成文件的输入,例如生成目标文件的输入是C文件和头文件,生成可执行文件的输入是目标文件;
  3. recipe是需要执行的动作,可以理解成命令。recipe前面要加上一个Tab制表符。

知道了以上规则,就可以写一个简单的Makefile了。

3 一个简单的Makefile

3.1 帮助文档中的例子

Hightec的帮助文档中举了个例子来演示Makefile,如下图所示。
在这里插入图片描述
该Makefile主要做了一下几件事:

  • 将8个源文件编译成目标文件;
  • 将8个目标文件链接成一个可执行文件edit
  • clean清除掉目标文件和可执行文件。

3.2 例1:一个简单的Makefile

帮助文档中只是个演示,并没有附带源文件供我们练习。因此博主自己写了简单的源文件头文件和Makefile,研究Makefile的执行过程和结果。另外,由于链接过程需要编写复杂的链接脚本,所以在下面的例子中只尝试编译的过程。

1)首先在同一个路径下建立三个文件:hello.c,hello.h,Makefile。
在这里插入图片描述
2)在hello.c中写入简单的变量和函数定义,如下所示。

/* hello.c */
#include "hello.h"int a = 10;int main(void)
{return 0;
}

在hello.h中写入对应的变量和函数声明,如下所示。

/* hello.h */
extern int a;
extern int main(void);

根据上文提到的规则,在Makefile中尝试写入编译hello.c的命令语句,如下所示。

hello.o : hello.c hello.htricore-gcc -c hello.cclean : rm hello.o

Makefile中包含了两个功能:调用tricore-gcc把hello.c编译成hello.o,以及移除hello.o。

3)打开命令提示符,切换到这三个文件所在的路径。然后输入make并回车,如下图所示。
在这里插入图片描述
命令窗口会显示tricore-gcc -c hello.c这一行命令语句。然后回到文件夹路径下,看到成功生成了hello.o文件。
在这里插入图片描述
4)在窗口中输入make clean并回车,就会执行Makefile中的clean命令,如下图所示。
在这里插入图片描述
命令窗口会显示rm hello.o这一行命令语句。然后回到文件夹路径下,之前的hello.o文件就被移除了。clean的功能在软件编译的过程中很常用。在这里,clean不是一个目标文件,而是一个动作。clean的冒号后面没有跟其他的文件,因而被称为伪目标。

5)当路径下已经有了hello.o文件的时候,再去执行make命令会发生什么呢?尝试执行两次make命令,如下图所示。
在这里插入图片描述
第二次执行make命令的时候,编译器返回了"make: ‘hello.o’ is up to date"这句话,表示hello.o文件已经是最新的了。这里就要提到一个Makefile的机制,就是如果target文件(冒号前的文件)的时间晚于prerequisite文件(冒号后的文件)的时间,就表示输入文件没有被更新过,所以不会进行重新编译。
在这里插入图片描述

4 make是如何执行Makefile的

4.1 默认目标

默认情况下,make从第一个target开始,这个target被称为默认目标。

例如在3.1中所述的帮助文档中的例子。当我们敲下了make指令的时候,会从第一条规则开始,也就是重链接出edit文件。但是在链接之前,make必须首先处理edit文件所依赖的输入文件,也就是.o文件。所以make会先编译所有需要重新编译的源文件,直到.o文件齐全。这有点像是一个金字塔结构,底层的target完成以后才能做顶层的target。

clean伪目标是个例外,因为它不是edit所依赖的输入,需要使用make clean指令来处理clean。

4.2 例2:使用默认目标

把例1中的Makefile进行修改,在编译hello.c之前做一个默认目标project.elf,依赖于输入文件hello.o文件,如下。

project.elf : hello.otricore-gcc -o project.elf hello.ohello.o : hello.c hello.htricore-gcc -c hello.cclean : rm project.elf hello.o

首先运行make clean,将当前路径的hello.o清除掉,只剩下hello.c,hello.h,Makefile三个文件。
在这里插入图片描述
然后,运行make。
在这里插入图片描述
在路径下就会生成project.elf和hello.o两个文件。
在这里插入图片描述
这个Makefile中就是以开头的project.elf作为默认目标。make先检测到默认目标所依赖的hello.o在当前路径中不存在,所以先去以hello.o为目标进行编译。编译完成后再以project.elf为目标去链接。

注意,这里的链接elf文件只是做一个演示,是为了说明默认目标的概念。实际上,链接过程非常复杂,不要被这个例子中的只言片语所误导。

5 使用变量让Makefile更简洁

5.1 变量的简单用法

在3.1帮助文档中的例子中,edit所依赖的.o文件有很多。如果Makefile中重复出现大量相同的字段,会很容易写错。这时就可以用一个变量来指代这一系列.o文件,如下图所示。
在这里插入图片描述
然后,在后文用到这一系列.o文件的地方,就可以用$(objects)来替换,如下图所示。
在这里插入图片描述

5.2 例3:在Makefile中使用变量

把例1中的Makefile进行修改,将hello.c和hello.h赋值给变量inputfile,然后再后面用到的地方换成$(inputfile),如下。

inputfile = hello.c hello.hhello.o : $(inputfile)tricore-gcc -c hello.cclean : rm hello.o

然后打开命令行运行make,效果和例1相同,都能生成hello.o文件。

6 通过make推导规则

6.1 隐式规则

在Makefile文件中可以不用把编译的所有规则写出来,因为make中有个概念叫隐式规则,可以自动推导依赖关系。例如,在make看到了一个.o文件的时候,会自动推导它的源文件是同名的.c文件,就不需要把.c文件也写进去了。所以3.1 帮助文档中的例子也可以写成下面这样。
在这里插入图片描述
main.o文件后面就不再写上输入文件main.c了,下面的cc规则也省略了。

6.2 例4:省略源文件

将例1中的Makefile修改,冒号后面的输入文件不带hello.c了,只带一个hello.h,如下。

hello.o : hello.htricore-gcc -c hello.cclean : rm project.elf hello.o

然后打开命令行,用make执行,效果和例1相同。

7 另一种风格的Makefile

由于有了Makefile的隐式规则,就可以不用把源文件清楚地写出来了。因此,诞生了另一种风格的Makefile,如下。
在这里插入图片描述
在编译规则中,冒号左边的目标是很多个.o文件,右边是头文件。这样的Makefile也是可以正确地执行的,但是依赖关系非常复杂,写的时候很容易出错。

8 清空路径的规则

上面的例子也说到,可以用make clean来清空路径下的文件。实际应用中最好按照以下方式来写clean。
在这里插入图片描述
这里包含了两个要素。首先,.PHONE表示clean是个伪目标,这样就不会把clean和名为clean的文件搞混淆。其次,在rm前面添加一个减号,表示即使rm出现错误也可以使make继续。

注意,诸如clean这样的规则不应放在makefile的开头,因为我们不希望它成为默认目标。

9 总结

本文学习了Makefile的基本概念,并且通过一些实例的操作,熟悉了Makefile的基本用法。

>>返回个人博客总目录


http://chatgpt.dhexx.cn/article/fWFI31Ya.shtml

相关文章

Makefile入门详解

文章目录 一、Makefile简介二、makefile 原理1、当有依赖文件不存在2、当所有依赖文件存在 三、makefile基本规则1.makefile规则三要素2.基本规则3、makfile中的变量3.1普通变量3.2自动变量3.3例程 4、makefile中的伪目标 四、makefile其他常用的规则五、makefile中的函数5.1函…

makefile脚本

文章目录 1.makefile进行工程管理2.文档里面输入的内容3.如何运行这个makefile文件3.makefile 的变量4.其他 1.makefile进行工程管理 先创建一个名称为makefile或者Makefile的文档 2.文档里面输入的内容 输入相应内容的时候,要遵循相应的规则 规则:用…

makefile简介

1.make是一个应用程序 解析源程序之间的依赖关系 根据依赖关系自动维护编译工作 执行宿主操作系统中的各种命令 2.makefile是一个描述文件 定义一系列的规则来指定源文件编译的先后顺序 拥有特定的语法规则,支持函数定义和函数调用 能够直接集成操作系统中的各种命…

makefile变量

1.变量和不同的赋值方式 (1)makefile中支持程序设计语言中变量的概念 (2)makefile中的变量只代表文本数据(字符串) (3)makefile中的变量名规则 变量名可以包含字符,数字,下划线 不能包含“:”,"#","“或” " …

Makefile介绍

Makefile 是一种常用于编译的脚本语言,它可以更好更方便的管理你的项目的代码编译,节约编译时间(没改动的文件不编译)。 注意 Makefile 文件命令必须是 Makefile 或者 makefile,并使用 make 命令编译。 1. 1个…

如何编写一个Makefile文件(手把手的教你)

如果有帮助,希望点赞支持,我会更有创作的动力哦 目录 一、概念理解(彩蛋藏在某个地方)1.1 什么是Makefile?1.2 为何使用Makefile? 二、实战代码演示与讲解2.1 没有makefile的项目是怎么创建运行的2.1.1 创建…

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

1、Makefile编译过程 Makefile文件中的命令有一定规范,一旦该文件编写好以后在Linux命令行中执行一条make命令即可自动编译整个工程。不同厂家的make可能会稍有不同,并且语法上也有区别,不过基本思想都差不多,主要还是落在目标依赖…

刘玉真先生语录

或问:“古今之法门多矣,何以此教独名‘净明忠孝’ ? ” 先生曰:“别无他说,‘净明’只是正心诚意,‘忠孝’只是扶植纲常。但世人习闻此语,多是忽略过去,此间却务真践实履。” 先生曰&#xff1…

俞敏洪用20年的经验笑谈人生:不要在穷的时候假装崇高

转载于: https://www.huxiu.com/article/174774/1.html 虎嗅注:本文是新东方创始人、洪泰基金联合创始人俞敏洪,于12月1日在麻省理工学院跟学生做的一个主题演讲,言辞幽默,充满智慧,有太多人生的道理。本文由微信公众号…

每日言论:『模仿他人是人生陷阱』

公众号关注 「奇妙的 Linux 世界」 设为「星标」,每天带你玩转 Linux ! 最近,我们建立了一个技术交流微信群。目前群里已加入了不少行业内的大神,有兴趣的同学可以加入和我们一起交流技术,在 「奇妙的 Linux 世界」 公…

38岁,外企技术经理,失业:职场遇到瓶颈,你可能掉进了“能力陷阱”!

作者| Mr.K 编辑| Emma 来源| 技术领导力(ID:jishulingdaoli) 一位读者小R,给我讲述了他的职场经历。 小R,2008年通信专业硕士毕业。先去了华为,做了1年觉得有点苦,就去学了1年英语,后来跳槽到摩托罗拉。…

复旦大学教师 于娟博士《为啥是我得癌症?》

复旦女教师于娟已经去世半年多了,但这篇《为啥是我得癌症?》值得每个人认真阅读。 于娟,女,32岁,祖籍山东济宁,海归,博士,复旦大学优秀青年教师,一个两岁孩子的母亲&a…

《思考致富》不应该指望不经历“暂时的失败”便能发财

目录 作者简介 经典摘录 机遇有个狡猾的习惯,喜欢从后门悄悄溜进来,往往还喜欢以灾难或暂时失败的方式乔装露面 离金矿仅有三英尺远 欲望:成就一切的起点(通往致富之路的第一步) 信念:在脑海里目睹并坚…

复旦女博士于娟:为啥是我得癌症?

复旦女博士于娟:为啥是我得癌症?【请所有的朋友看看此文】 复旦女教师于娟已经去世半年多了,但这篇《为啥是我得癌症?》值得每个人认真阅读。不要再瞎吃八吃、暴饮暴食、嗜荤如命,不要再拼命工作、天天熬夜&#xff0…

[转载]复旦女博士于娟——为啥是我得癌症? (转)

[转载]复旦女博士于娟——为啥是我得癌症? (转) (2012-07-30 13:47:00) 转载▼ 标签: 转载 黄帝内经之类。就此引用一段话: 下午5--7点酉时 肾经当令 晚上7--9点戌时 心包经当令 9-11点亥时 三焦经当令 11-1点子时 胆经当令 凌晨1--3点丑时 肝经当令 3…

38岁,外企技术经理,失业:职场遇到瓶颈,你可能掉进了“能力陷阱”

一位读者小R,给我讲述了他的职场经历。 小R,2008年通信专业硕士毕业。先去了华为,做了1年觉得有点苦,就去学了1年英语,后来跳槽到摩托罗拉。 呆了12年,自己也熬到了技术经理的岗位。其实,2013年…

于娟《生命日记》——复旦大学教师于娟对大学生健康的建议

下文很长,需要你花点耐心,总结只有一句:珍惜、享受。 “在生死临界点的时候,你会发现,任何的加班(长期熬夜等于慢性自杀),给自己太多的压力,买房买车的需求,这…

此生未完成 --- 于娟

文章目录 图书外观好句摘录Part1 病隙日记01 “为啥是我得癌症”的非学术报告02 我的二〇一〇 Part2 人间烟火03 写给我的宝贝04 碎落在身后的时光05 远在天涯06 生为女人 Part3 唯念芳辰07 刹那芳华:于娟的诗 图书外观 好句摘录 Part1 病隙日记 01 “为啥是我得癌…

于娟的忠告----生命只有一次,活着才是王道啊

复旦女教师于娟已经去世半年多了,但这篇《为啥是我得癌症?》值得每个人认真阅读。 于娟,女,32岁,祖籍山东济宁,海归,博士,复旦大学优秀青年教师,一个两岁孩子的母亲,乳腺癌晚期患者。 2009年12月被确诊患上了乳腺癌,2010年1月2日于娟被进一步确诊乳腺癌晚期, 2011年…

于娟的忠告----生命只有一次,活着才是王道啊!!!

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴! 复旦女教师于娟已经去世半年多了,但这篇《为啥是我得癌症?》值得每个人认真阅读。 于…