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

07makefile文件的更多相关文章

  1. Mapreduce的文件和hbase共同输入

    Mapreduce的文件和hbase共同输入 package duogemap;   import java.io.IOException;   import org.apache.hadoop.co ...

  2. mapreduce多文件输出的两方法

    mapreduce多文件输出的两方法   package duogemap;   import java.io.IOException;   import org.apache.hadoop.conf ...

  3. 01.SQLServer性能优化之----强大的文件组----分盘存储

    汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 文章内容皆自己的理解,如有不足之处欢迎指正~谢谢 前天有学弟问逆天:“逆天,有没有一种方 ...

  4. SQL Server 大数据搬迁之文件组备份还原实战

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 解决方案(Solution) 搬迁步骤(Procedure) 搬迁脚本(SQL Codes) ...

  5. SQLSERVER将一个文件组的数据移动到另一个文件组

    SQLSERVER将一个文件组的数据移动到另一个文件组 有经验的大侠可以直接忽视这篇文章~ 这个问题有经验的人都知道怎麽做,因为我们公司的数据量不大没有这个需求,也不知道怎麽做实验 今天求助了QQ群里 ...

  6. SQL Server中的高可用性(2)----文件与文件组

        在谈到SQL Server的高可用性之前,我们首先要谈一谈单实例的高可用性.在单实例的高可用性中,不可忽略的就是文件和文件组的高可用性.SQL Server允许在某些文件损坏或离线的情况下,允 ...

  7. C# ini文件操作【源码下载】

    介绍C#如何对ini文件进行读写操作,C#可以通过调用[kernel32.dll]文件中的 WritePrivateProfileString()和GetPrivateProfileString()函 ...

  8. 【小程序分享篇 一 】开发了个JAVA小程序, 用于清除内存卡或者U盘里的垃圾文件非常有用

    有一种场景, 手机内存卡空间被用光了,但又不知道哪个文件占用了太大,一个个文件夹去找又太麻烦,所以我开发了个小程序把手机所有文件(包括路径下所有层次子文件夹下的文件)进行一个排序,这样你就可以找出哪个 ...

  9. 【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新

    上一篇文章介绍了Dex文件的热更新流程,本文将会分析Tinker中对资源文件的热更新流程. 同Dex,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方 ...

随机推荐

  1. 编写大型项目web页面 从写web登陆页面开始

    web页面搭建需要准备什么工具 首先我们会和设计师沟通 我们需要一些检验设计的工具 ps 自动裁图 自动测量工具 (我这里安利一下一个工具 我用的cutterman) sketch 可以使用阿里的工具 ...

  2. Codepen 每日精选(2018-3-31)

    按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以打开原始页面. 制作像素画的画板https://codepen.io/abeatrize/... 纯 css 画的晚上的风 ...

  3. ES6-11学习笔记--Map

    Map:一种新的数据结构 常用方法 遍历 应用场景 WeakMap   常用方法: let map = new Map() let obj = { name: '张三' } map.set(obj, ...

  4. python-蒙特·卡罗法计算圆周率

    [题目描述]蒙特·卡罗方法是一种通过概率来得到问题近似解的方法,在很多领域都有重要的应用,其中就包括圆周率近似值的计问题.假设有一块边长为2的正方形木板,上面画一个单位圆,然后随意往木板上扔飞镖,落点 ...

  5. Paxos算法的一个简单小故事

    一.Paxos是什么? Paxos,它是一个基于消息传递的一致性算法,Leslie Lamport在1990年提出,近几年被广泛应用于分布式计算中,Google的Chubby,Apache的Zooke ...

  6. vue 相关问题整理

  7. Java习题

    public class ClassTest{ String str = new String("hello"); char[] ch = {'a','b','c'}; publi ...

  8. 直接远程下载或上传文件到linux系统中的简单办法

    如果执行sz 或者rz 没有这个命令,则安装lrzsz包执行:yum install lrzsz 等待安装完毕,然后一直输入Y即可. sz:将选定的文件发送(send)到本地机器 -a 以文本方式传输 ...

  9. python基础练习题(题目 文本颜色设置)

    day23 --------------------------------------------------------------- 实例035:设置输出颜色 题目 文本颜色设置. 分析:不会, ...

  10. 深度剖析text-align家族

    大家好,我是半夏,一个刚刚开始写文的沙雕程序员.如果喜欢我的文章,可以关注 点赞 加我微信:frontendpicker,一起学习交流前端,成为更优秀的工程师-关注公众号:搞前端的半夏,了解更多前端知 ...