跟我一起写Makefile

1:什么是Makefile,有什么作用
什么是Makefile:makefile是一个专门用于编译程序的工具
makefile是在gcc的基础下形成相当于命令集合的工具 gcc -c main.c -o main.o
gcc -c fun.c -o fun.o
gcc main.o fun.o -o main
正常这三个指令我们每次编译都需要手动敲上去 如果又没Makefile 那么我们把编译指令写入Makefile 就仅仅只需要在中断敲make即可编译 你也可以把Makefile理解为命令集合–>它又不完全是命令集合有什么样的作用: 帮助我们编译大型的工程 现在有很多文件我们只需要在中断写入make指令即可完成编译Makefile文件特性: 他是一个工具也是一个文件 这个文件默认系统支持不需要安装任何软件 * 这个文件必须以 Makefile/makefile – 命名2:最简单的Makefile示例第一个Makefileall: gcc -c main.c -o main.o gcc -c fun.c -o fun.o gcc main.o fun.o -o main3:Makefile示例分析示例分析: all: — > makefile中叫做目标 主目标—执行make一定会执行的 次目标—必须执行 make + 目标名 目标下面跟的: 就是相关的指令 这些指令可以是系统命令/环境变量 也可以是Makefile支持函数 强调一点: 目标下的命令必须以 Tab键开头 默认情况下只会执行第一个目标-主目标4:Makefile的依赖关系和执行过程main:main.o fun.o gcc main.o fun.o -o main如果没有依赖文件: 1:我去寻找依赖文件的目标去执行 2:找不到就报错经过改版:第二个Makefile:main:main.o fun.o gcc main.o fun.o -o mainmain.o:main.c gcc -c main.c -o main.ofun.o:fun.c gcc -c fun.c -o fun.o * " : " 冒号后面是目标依赖文件/依赖目标 * 只有依赖目标/文件得以执行 主目标才能执行5:Makefile的普通变量 Makefile的变量: 1:什么时候用什么时候就可以定义 2:Makefile的变量没有类型之分 3:makefile的变量通过 $符号引用 --变量里面的内容++++++++++++++++++++++++++++++++++++++++++++++++++++++name = 123456789main:main.o fun.o gcc main.o fun.o -o mainmain.o:main.c gcc -c main.c -o main.ofun.o:fun.c gcc -c fun.c -o fun.oecho: @echo “name” == $(name) 执行 make echo 就会执行echo的目标 执行@echo “name” == ( n a m e ) 结 果 : n a m e = = 1234567896 : M a k e f i l e 的 特 殊 变 量 (name) 结果: name == 1234567896:Makefile的特殊变量 (name)name==1234567896Makefile@:代表目标 : 代 表 目 标 依 赖 文 件 集 合 ^:代表目标依赖文件集合 :<:代表目标依赖文件集合的第一个文件 < : 质 变 — > <:质变—>%统配符规则下回发生质变第三个Makefile:OBJ = main <>(OBJ):main.o fun.o gcc $^ -o $@main.o:main.c gcc -c $^ -o $@fun.o:fun.c gcc -c $^ -o $@echo: @echo “name” == ( n a m e ) 特 性 : s h e l l − > 专 用 的 写 命 令 集 合 的 文 件 他 也 可 向 M a k e f i l e 一 样 写 g c c − c m a i n . c − o m a i n . o g c c − c f u n . c − o f u n . o g c c m a i n . o f u n . o − o m a i n 也 可 以 实 现 编 译 那 么 M a k e f i l e 跟 S h e l l 脚 本 有 什 么 区 别 ? ∗ 自 动 检 测 你 的 文 件 是 否 修 改 ∗ 如 果 修 改 则 编 译 − 没 修 改 编 译 ∗ M a k e f i l e 只 会 编 译 修 改 过 的 文 件 这 有 什 么 好 处 ? − − 快 7 : M a k e i f l e 通 配 符 匹 配 M a k e f i l e 有 一 个 通 配 符 − − (name) 特性: shell->专用的写命令集合的文件 他也可向Makefile一样写 gcc -c main.c -o main.o gcc -c fun.c -o fun.o gcc main.o fun.o -o main 也可以实现编译 那么Makefile跟Shell脚本有什么区别? *自动检测你的文件是否修改 *如果修改 则编译 -没修改编译 *Makefile只会编译修改过的文件 这有什么好处?--快7:Makeifle通配符匹配Makefile 有一个通配符 -- % 它就相当于Linux下的 * 第四个Makefile:OBJ = main (name)shell>Makefilegcccmain.comain.ogcccfun.cofun.ogccmain.ofun.oomainMakefileShellMakefile7MakeifleMakefile(OBJ):main.o fun.o gcc $^ -o $@%.o:%.c gcc -c $< -o $@clean: rm .o main/**************************************************/ * main.c fun.c - > %.c * fun.o main.o -> %.o 在%符号的规则下 $<就不再是集合的第一个文件了 而是集合的每一个文件%.o:%.c gcc -c $< -o $@ 相当于:main.o:main.c gcc -c $< -o $@fun.o:fun.c gcc -c $< -o @ 8 : M a k e f i l e 专 用 函 数 @8:Makefile专用函数 @8Makefile(wildcard PATTERN…)通配符”%”只有在规则中才会展开,如果在变量定义和函数使用的时候,则不会自动展开,这时候就要用到 wildcard函数 例如$(wildcard .c) 获取当前目录下的所有.c文件,类似“%” “” 路径不要用/obj/src形式 用 obj/src 前面没有根目录 也可以是./obj/srcpatsubst:模式字符串替换 $(patsubst %.c,%.o,a.c b.c c.c) 把字符串的.c 替换成 .o 将字符串“a.c b.c c.c”中的所有符合“%.c”的字符串,替换为“%.o”替换完成以后的字符串为“a.o b.o c.o”。有了第五个Makefile:OBJ = mainCFILE = $(wildcard .c)OFILE = ( p a t s u b s t (patsubst %.c,%.o, (patsubst(CFILE)) ( O B J ) : (OBJ): (OBJ):(OFILE) gcc $^ -o $@%.o:%.c gcc -c $< -o $@clean: rm .o mainecho: @echo “CFILE” = $(CFILE)@echo “OFILE” = ( O F I L E ) 其 他 剩 余 函 数 : (OFILE)其他剩余函数: (OFILE)(foreach , , )此函数就是把参数中的单词逐一取出来放到参数 里面,然后再执行 的表达式。每次 都会返回一个字符串,循环中, 中所包含的每个字符串会以空格隔开,最后整个循环结束, 所返回的字符串集合将是foreach函数的返回值什么是集合: 一般集合以空格隔开 举个例子: a.c b.c c.c d.c / / ( n o t d i r < n a m e … > ) 此 函 数 用 提 提 取 < n a m e > 目 录 里 的 部 分 返 回 值 是 文 件 名 序 列 < n a m e s > 的 目 录 里 之 外 的 部 分 例 如 : (notdir <name…>) 此函数用提提取<name>目录里的部分返回值是文件名序列<names>的目录里之外的部分例如: (notdir<name>)<name><names>(notdir /src/a.c)结果: a.c./API/fun.cnotdir -> fun.c patsubst-> ./OBJ/fun.c ->输出的文件(.o)路径->OBJ文件夹里面/*****************/ - I 头文件路径
最后附上一张我的Makefile
在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
跟我一起 Makefile 作者:陈皓 整理:祝冬华 来源网络,希望能与大家分享这份学习资料,资源分数也设置了最低值,如有侵权,请联系我删除文件。 第一部分、概述 (6) 第二部分、关于程序的编译和链接 (6) 第三部分、Makefile 介绍 (7) 一、Makefile的规则 (7) 二、一个示例 (8) 三、make是如何工作的 (9) 四、makefile中使用变量 (10) 五、让make自动推导 (11) 六、另类风格的makefile (12) 七、清空目标文件的规则 (13) 第四部分、Makefile 总述 (13) 一、Makefile里有什么? (13) 1、显式规则。 (14) 2、隐晦规则。 (14) 3、变量的定义。 (14) 4、文件指示。 (14) 5、注释。 (14) 二、Makefile的文件名 (15) 三、引用其它的Makefile (15) 四、环境变量 MAKEFILES (16) 五、make的工作方式 (16) 第五部分、书规则 (17) 一、规则举例 (17) 二、规则的语法 (17) 三、在规则中使用通配符 (18) 四、文件搜寻 (19) 五、伪目标 (20) 六、多目标 (22) 七、静态模式 (22) 八、自动生成依赖性 (24) 第六部分书命令 (25) 一、显示命令 (26) 二、命令执行 (26) 三、命令出错 (27) 四、嵌套执行make (28) 五、定义命令包 (30) 第七部分使用变量 (30) 一、变量的基础 (31) 二、变量中的变量 (32) 三、变量高级用法 (34) 四、追加变量值 (37) 五、override 指示符 (37) 六、多行变量 (38) 八、目标变量 (39) 九、模式变量 (40) 第八部分使用条件判断 (40) 一、示例 (40) 二、语法 (42) 第九部分使用函数 (43) 一、函数的调用语法 (44) 二、字符串处理函数 (44) 1、subst (44) 2、patsubst (45) 3、strip (45) 4、findstring (46) 5、filter (46) 6、filter-out (46) 7、sort (47) 8、word (47) 9、wordlist (47) 10、words (47) 11、firstword (48) 12、字符串函数实例 (48) 三、文件名操作函数 (48) 1、dir (48) 2、notdir (48) 3、suffix (49) 4、basename (49) 5、addsuffix (49) 6、addprefix (49) 7、join (50) 四、foreach 函数 (50) 五、if 函数 (50) 六、call函数 (51) 七、origin函数 (51) “undefined” (52) “default” (52) “file” (52) “command line” (52) “override” (52) “automatic” (52) 八、shell函数 (53) 九、控制make的函数 (53) 1、error (53) 2、warning (54) 第十部分 make 的运行 (54) 二、指定Makefile (54) 三、指定目标 (55) “all” (56) “clean” (56) “install” (56) “print” (56) “tar” (56) “dist” (56) “TAGS” (56) “check”和“test” (56) 四、检查规则 (57) 五、make的参数 (57) 第十一部分隐含规则 (61) 一、使用隐含规则 (61) 二、隐含规则一览 (62) 1、编译C程序的隐含规则 (63) 2、编译C++程序的隐含规则 (63) 3、编译Pascal程序的隐含规则 (63) 4、编译Fortran/Ratfor程序的隐含规则 (63) 5、预处理Fortran/Ratfor程序的隐含规则 (63) 6、编译Modula-2程序的隐含规则 (63) 7、汇编和汇编预处理的隐含规则 (64) 8、链接Object文件的隐含规则 (64) 9、Yacc C程序时的隐含规则 (64) 10、Lex C程序时的隐含规则 (64) 11、Lex Ratfor程序时的隐含规则 (65) 12、从C程序、Yacc文件或Lex文件创建Lint库的隐含规则 (65) 三、隐含规则使用的变量 (65) 1、关于命令的变量。 (65) 2、关于命令参数的变量 (66) 四、隐含规则链 (67) 五、定义模式规则 (68) 1、模式规则介绍 (68) 2、模式

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值