makefile

  • 规则:
目标: 依赖
(tab)命令

第一个版本:

main: main.c fun1.c fun2.c sum.c
gcc -o main main.c fun1.c fun2.c sum.c

第二个版本:

检查规则:
要想生成目标文件, 先要检查依赖条件是否都存在:
若都存在, 则比较目标时间和依赖的时间, 如果依赖的时候比目标的时间新,
则重新生成目标; 否则不重新生成
若不存在, 则往下找有没有生成依赖的规则, 有则生成, 如果没有则报错.
  • 例子
main:main.o fun1.o fun2.o sum.o
gcc -o main main.o fun1.o fun2.o sum.o main.o:main.c
gcc -o main.o -c main.c -I./ fun1.o:fun1.c
gcc -o fun1.o -c fun1.c fun2.o:fun2.c
gcc -o fun2.o -c fun2.c sum.o:sum.c
gcc -o sum.o -c sum.c

第三个版本:

普通变量

*	变量定义直接用 =
* 使用变量值用 $(变量名)
如:下面是变量的定义和使用
foo = abc // 定义变量并赋值
bar = $(foo) // 使用变量, $(变量名)
定义了两个变量: foo、bar, 其中bar的值是foo变量值的引用。
除了使用用户自定义变量, makefile中也提供了一些变量(变量名大写)供用户直接使用, 我们可以直接对其进行赋值:
CC = gcc #arm-linux-gcc
CPPFLAGS : C预处理的选项 -I
CFLAGS: C编译器的选项 -Wall -g -c
LDFLAGS : 链接器选项 -L -l

自动变量

*	$@: 表示规则中的目标
* $<: 表示规则中的第一个条件
* $^: 表示规则中的所有条件, 组成一个列表, 以空格隔开, 如果这个列表中有重复的项则消除重复项 特别注意:自动变量只能在规则的命令中使用.

模式规则

至少在规则的目标定义中要包含’%’, ‘%’表示一个或多个, 在依赖条件中同样可以使用’%’, 依赖条件中的’%’的取值取决于其目标:
比如: main.o:main.c fun1.o: fun1.c fun2.o:fun2.c, 说的简单点就是: xxx.o:xxx.c
变量:
自定义变量: var = hello, $(var)
自带变量: CC CPPFLAGS CFLAGS LDFLAGS
自动变量: $@ $< $^
模式规则:
%.o:%.c------> 前后的%必须是相同
  • 例子:
target=main
object=main.o fun1.o fun2.o sum.o
CC=gcc
CPPFLAGS=-I./ $(target):$(object)
$(CC) -o $@ $^ %.o:%.c
$(CC) -o $@ -c $< $(CPPFLAGS) #main.o:main.c
# gcc -o main.o -c main.c -I./
#
#fun1.o:fun1.c
# gcc -o fun1.o -c fun1.c
#
#fun2.o:fun2.c
# gcc -o fun2.o -c fun2.c
#
#sum.o:sum.c
# gcc -o sum.o -c sum.c

第四个版本:

1.wildcard – 查找指定目录下的指定类型的文件
src=$(wildcard *.c) //找到当前目录下所有后缀为.c的文件,赋值给src
2.patsubst – 匹配替换
obj=$(patsubst %.c,%.o, $(src)) //把src变量里所有后缀为.c的文件替换成.o 如: 当前目录下有a.c b.c c.c
src=$(wildcard *.c) -----> src=a.c b.c c.c
obj=$(patsubst %.c,%.o, $(src)) -----> obj=a.o b.o c.o
  • 例子
src=$(wildcard ./*.c)
object=$(patsubst %.c, %.o, $(src)) # 将.c文件替换成.o文件 # object=main.o fun1.o fun2.o sum.o target=main
CC=gcc
CPPFLAGS=-I./ $(target):$(object)
$(CC) -o $@ $^ %.o:%.c
$(CC) -o $@ -c $< $(CPPFLAGS) #main.o:main.c
# gcc -o main.o -c main.c -I./
#
#fun1.o:fun1.c
# gcc -o fun1.o -c fun1.c
#
#fun2.o:fun2.c
# gcc -o fun2.o -c fun2.c
#
#sum.o:sum.c
# gcc -o sum.o -c sum.c

第五个版本:

增加清理功能.
终极目标: makefile文件中第一次出现的目标叫做终极目标
.PHONY:clean
clean:
rm -f .... 使用-f可以指定makefile文件, 如: make -f mainmak 总结:
如果不需要取别名
可以先make clean
然后make生成可执行文件
  • 例子
src=$(wildcard ./*.c)
object=$(patsubst %.c, %.o, $(src)) # object=main.o fun1.o fun2.o sum.o target=main
CC=gcc
CPPFLAGS=-I./ $(target):$(object)
$(CC) -o $@ $^ %.o:%.c
$(CC) -o $@ -c $< $(CPPFLAGS) .PHONY:clean
clean:
-rm -f $(target) $(object) #main.o:main.c
# gcc -o main.o -c main.c -I./
#
#fun1.o:fun1.c
# gcc -o fun1.o -c fun1.c
#
#fun2.o:fun2.c
# gcc -o fun2.o -c fun2.c
#
#sum.o:sum.c
# gcc -o sum.o -c sum.c

最新文章

  1. 总结隐藏Ribbon菜单的方法
  2. java 16-6 泛型
  3. Commando War
  4. ubuntu下c/c++开发环境配置
  5. C#创建Windows服务入门图解(VS2010)
  6. Velocity - 单例还是非单例
  7. 解决 iOS webkit 使用CSS动画时闪烁的问题
  8. mysql5.1,5.5,5.6做partition时支持的函数
  9. 记一次win10+oracle11.2安装
  10. Springboot异常:org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name &#39;userController&#39;
  11. cas单点登录
  12. WP-PostViews使用
  13. Hibernate_day01讲义_使用Hibernate完成对CRM系统中客户管理的DAO中的CRUD的操作
  14. 深入 Java 调试体系: 第 1 部分,初探JPDA 体系
  15. C++ vector类型要点总结
  16. ThinkPHP简单结构介绍!
  17. (9)SpriteFrameCache和TextureCache
  18. 如何优化Java垃圾回收-zz
  19. hdu 5833(欧拉路)
  20. 重建二叉树(C++和Python实现)

热门文章

  1. 探讨:微信小程序应该如何设计
  2. 解决vscode开发react项目没有html标签自动补全
  3. 关于data自定义属性
  4. 用 rollup + gulp 造个轮子,别说还挺香
  5. 分库分表实现方式Client和Proxy,性能和维护性该怎么选?
  6. CommonsCollection7反序列化链学习
  7. Spring Boot 使用 Redis 共享 Session 代码示例
  8. eBPF Cilium实战(2) - 底层网络可观测性
  9. Selenium3自动化测试【27】Frame的操作
  10. 『现学现忘』Git对象 — 16、Tree对象详解