Makefile介绍

article/2025/10/2 20:34:11

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

1. 1个规则
        目标...: 依赖...          目标:即要生成的文件;依赖:即目标文件由哪些文件生成
        命令1                       命令:注意每条命令前必须有且仅有一个 tab 保持缩进,这是语法要求。
        命令2
        ...

        伪目标:
        在Makefile中,.PHONY后面的target表示的是一个伪造的target, 而不是真实存在的文件target,注意Makefile的target默认是文件。
        如:对于工程的清理,需要写一个clean功能,这种类似的功能,不需要依赖文件,这种命令称作伪目标。

        .PHONY关键字介绍:         

        小结:
                用.PHONY声明的伪目标,在同级目录下
                单词“clean”不代表此Makefile中的文件名;
                Makefile与名为“clean”的文件无关

2. Makefile中的变量

        1.用户自定义变量 --宏
        OBJ = main.o func1.o ...
        hello : $(OBJ)
            gcc $(OBJ) -o hell
        2.预定义变量
        AR --> ar
        CC --> 编译器
        ARFLAGS --> 库编译选项
        CFLAGS --> C编译器选项
        #举例 CFLAGS = -g -c
            gcc $(CFLAGS) func.c
      3.自动变量
        $* --> 不包含扩展名的目标文件名称 #main.o : main.c   $* 表示main.o 中的main
        $< --> 表示第一个依赖文件的名称
        $? --> 所有时间戳比目标文件晚的依赖文件
        $@ --> 目标文件的完成名称
        $^ --> 所有不重复的依赖文件
            # hello : main.o func1.o
            #   $(CC) $^ -o $@

3. makefile 条件判断
        ifeq ($(CC),gcc)            #不等于ifneq ($(变量名),比较值);ifeq和小括号之间右空格
            gcc $^ -o $@
        else
            $(CC) $^ -o $@
        endif

        注意:条件判断不能用tab 打头,要顶格书写

4. Makefile的嵌套和引用

        1)引用:include proc/makefile
        Makefile中的include命令与C语言中的include命令类似,命令include file.dep,即把file.dep文件在当前Makefile文件中展开,亦即把file.dep文件的内容包含进当前Makefile文件;
        如果Makefile中有以file.dep为目标的规则,make会先使用规则对file.dep文件进行更新,然后将更新后的file.dep文件包含进当前Makefile文件。

        2)嵌套
        $(MAKE) -C subdir(cd subdir ; 执行make命令)
        make -C ./toolchain/ clean all(cd ./toolchain/ ; 执行 make clean + make all命令)

5. makefile 管理命令

        -C dir            执行指定文件夹下面的makefile
        -f file             读入当前文件夹下的file 为 Makefile(当同一级别中有多个makefile文件)
        -i                   忽略所有命令执行的错误
        -I dir              指定被包含(include)的Makefile 的路径

6. 常用函数

    1)wildcard(通配符匹配函数)
        在Makefile规则中,通配符会被自动展开。但在变量的定义和函数引用时,通配符将失效。这种情况下如果需要通配符有效,就需要使用函数“wildcard”
        如果不存在任何符合此模式的文件,函数会忽略模式字符并返回空
    例如:
        $(wildcard *.c)来获取工作目录下的所有的.c文件列表(默认当前目录)
    2)notdir
        notdir用于去掉文件的绝对路径,只保留文件名。一般结合wildcard使用;
        格式:$(notdir 文件列表)
    例子:
        $(notdir $(wildcard *.sh)):对匹配的全部脚本只保留文件名
    3)patsubst(模式字符串替换函数)
        格式:$(patsubst <pattern>,<replacement>,<text> )
        功能:查找<text>中的单词(单词以“空格”、“Tab”或“回车”“换行”分隔)是否符合模式<pattern>,如果匹配的话,则以<replacement>替换。

        这里,<pattern>可以包括通配符“%”,表示任意长度的字串。如果<replacement>中也包含“%”,那么,<replacement>中的这个“%”将是<pattern>中的那个“%”所代表的字串。(可以用“\”来转义,以“\%”来表示真实含义的“%”字符)
        返回:函数返回被替换过后的字符串。一般结合wildcard/notdir使用;
    例子:
        SCRIPTS = $(notdir $(wildcard *.c))                    #匹配全部的.c文件
        FILES = $(patsubst %.c,%.sh, $(SCRIPTS))       #将.c文件全部转换为.sh脚本文件
        注意:只是在代码中进行模式替换,真实文件类型未改变


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

相关文章

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

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

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

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

刘玉真先生语录

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

此生未完成 --- 于娟

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

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

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

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

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

于娟临终前的忠告(二)

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

inode和软硬链接

文章目录&#xff1a; 一、理解文件系统1.1 什么是inode1.2 磁盘了解1.2.1磁盘的硬件结构1.2.2 磁盘的分区1.2.3 EXT2文件系统 二、软硬链接2.1 软链接2.2 硬链接 一、理解文件系统 1.1 什么是inode inodes 是文件系统中存储文件元数据的数据结构。每个文件或目录都有一个唯一…

服务器inode满了怎样删除文件,inode满了

inode满了 内容精选 换一换 可能原因:客户端缓冲区(output buffer)占用过多的内存空间。解决方案:Redis-cli客户端连接实例后,执行大key扫描命令:redis-cli --bigkeys,然后执行info,查看output buffer占用情况。 系统每30秒周期性检测磁盘Inode使用率,并把实际Inode使用…

一、Inode

文章目录 一、Inode概述1.1、文件数据包括元信息与实际数据1.2、inode的特殊作用1.3、Linux系统文件三个主要的时间属性1.4、目录文件的结构1.5、inode的号码 二、inode的大小三、链接文件四、恢复EXT类型的文件五、恢复XFS类型的文件xfsdump命令格式六、xfsdump使用限制七、日…

inode节点(详解)

首先&#xff0c;要明确理解inode是理解Linux/Unix文件系统和硬盘存储的基础。 1.什么是inode&#xff1f; 理解inode&#xff0c;要从文件存储说起。文件存储在硬盘上&#xff0c;硬盘的最小存储单位叫做“扇区”。每个扇区能存储512字节&#xff08;相当于0.5KB&#xff09…