关于Makefile

来源:互联网 发布:股票佣金万3怎么算法 编辑:程序博客网 时间:2024/05/07 10:53









Makefile

Makefile.............................................................................................................................. 1

1.      文件的命名规则.......................................................................................................... 3

1.1.      Makefile................................................................................................................ 3

1.2.      makefile................................................................................................................ 3

2.      用途.............................................................................................................................. 3

2.1.      项目代码编译管理.............................................................................................. 3

2.2.      节省编译项目的时间.......................................................................................... 3

2.3.      一次编写终身受益.............................................................................................. 3

3.      基本规则...................................................................................................................... 3

3.1.1.       目标:依赖 (tab)命令............................................................................ 3

3.1.2.       Makefile会把规则中的第一个目标作为终极目标................................... 4

4.       工作原理..................................................................................................................... 4

4.1.      若想生成目标,检查规则中的依赖条件是否存在,  如果不存在,寻找是否有规则用来生成该依赖文件   4

4.2.      检查规则中的目标是否需要更新,必须检查它的所有依赖,  依赖中有任意一个被更新,则目标必须更新............................................................................................................................. 4

4.2.1.       依赖文件比目标文件时间晚,则需要更新............................................... 4

5.       执行............................................................................................................................. 4

5.1.      make --> 通过makefile生成目标文件............................................................. 4

5.1.1.       直接 make (使用makefile文件).......................................................... 4

5.1.2.       make -f mm (指定一个名字不为makefile的文件)................................... 4

5.2.      make clean --> 清除编译生成的中间.o文件和最终目标文件........................ 4

5.2.1.       如果当前目录下有同名clean文件,则不执行clean对应的命令......... 4

5.2.2.       特殊符号....................................................................................................... 4

6.       变量............................................................................................................................. 4

6.1.      普通变量.............................................................................................................. 5

6.1.1.       变量定义及赋值:obj = a.o b.oc.o............................................................. 5

6.1.2.       变量取值:foo = $(obj)................................................................................ 5

6.1.3.       由 Makefile 维护的一些变量.................................................................... 5

6.2.      自动变量.............................................................................................................. 5

6.2.1.       变量............................................................................................................... 5

6.2.2.       模式规则....................................................................................................... 5

7.       函数............................................................................................................................. 6

7.1.      makefile中所有的函数必须都有返回值........................................................... 6

7.2.      wildcard................................................................................................................ 6

7.2.1.       查找指定目录下指定类型的文件,一个参数........................................... 6

7.2.2.       src = $(wildcard ./src/*.c).......................................................................... 6

7.3.      patsubst................................................................................................................. 6

7.3.1.       匹配替换,从src中找到所有.c 结尾的文件,并将其替换为.o............ 6

7.3.2.       obj = $(patsubst %.c ,%.o ,$(src)).................................................................. 6

7.3.3.       ob = $(patsubst ./src/%.c, ./obj/%.o, $(src)).................................................. 6


1.      文件的命名规则

1.1.         Makefile

1.2.         makefile

2.      用途

2.1.         项目代码编译管理

2.2.         节省编译项目的时间

2.3.         一次编写终身受益

3.      基本规则

3.1.          

3.1.1.          目标:依赖
(tab)命令

目标 --> 要生成的目标文件

伪目标

依赖 --> 生成目标文件需要的一些文件

命令 --> 借助依赖文件生成目标文件的手段

忽略错误命令继续执行
不显示执行时候的命令细节

tab --> 缩进,有且只有一个

3.1.2.          Makefile会把规则中的第一个目标作为终极目标

all:app -->all指定生成的最终目标为app

4.      工作原理

4.1.         若想生成目标,检查规则中的依赖条件是否存在,

如果不存在,寻找是否有规则用来生成该依赖文件

4.2.         检查规则中的目标是否需要更新,必须检查它的所有依赖,

依赖中有任意一个被更新,则目标必须更新

4.2.1.          依赖文件比目标文件时间晚,则需要更新

5.      执行

5.1.         make --> 通过makefile生成目标文件

5.1.1.          直接 make (使用makefile文件)

5.1.2.          make -f mm (指定一个名字不为makefile的文件)

5.2.         make clean --> 清除编译生成的中间.o文件和最终目标文件

5.2.1.          如果当前目录下有同名clean文件,则不执行clean对应的命令

解决方案 --> 伪目标声明:.PHONY:clean

5.2.2.          特殊符号

- :表示此条命令出错,make也会继续执行后续的命令。如:“-rm a.o b.o”

6.      变量

6.1.         普通变量

6.1.1.          变量定义及赋值:obj = a.o b.o c.o

6.1.2.          变量取值:foo = $(obj)

6.1.3.          由 Makefile 维护的一些变量

通常格式都是大写

CC:默认值 cc

有些有默认值,有些没有

CPPFLAGS : 预处理器需要的选项 如:-I
CFLAGS:编译的时候使用的参数 –Wall –g -c
LDFLAGS :链接库使用的选项 –L -l

用户可以修改这些变量的默认值

CC = gcc

6.2.         自动变量

6.2.1.          变量

$@ --> 规则中的目标

$< --> 规则中的第一个依赖条件

$^ --> 规则中的所有依赖条件

6.2.2.          模式规则

在规则的目标定义中使用 %

在规则的依赖条件中使用 %

示例:

%.o:%.c
$(CC) –c $< -o $@
$< --> 表示依次取出依赖条件
$@ --> 表示依次取出目标值

7.      函数

7.1.         makefile中所有的函数必须都有返回值

7.2.         wildcard

7.2.1.          查找指定目录下指定类型的文件,一个参数

7.2.2.          src = $(wildcard ./src/*.c)

找到./src 目录下所有后缀为.c的文件,赋给变量src

7.3.         patsubst

7.3.1.          匹配替换,从src中找到所有.c 结尾的文件,并将其替换为.o

7.3.2.          obj = $(patsubst %.c ,%.o ,$(src))

把src变量中所有后缀为.c的文件替换成.o

7.3.3.          ob = $(patsubst ./src/%.c, ./obj/%.o, $(src))

指定.o 文件存放的路径 ./obj/%.o



0 0
原创粉丝点击