前言
因为在做项目时用到了Makefile,于是就去学习了Makefile的知识和规则,此文章仅为本人的学习笔记。
Makefile的规则
1.命名
可以命名为"GUNmakefile"、大多数情况下的make都支持"makefile"、“Makefile"的命名。可以命名为"GUNmakefile”,但不建议。
2.规则语法
targer…: prerequisites
command
targer为目标文件, prerequisites为依赖文件,command为命令上面的这段代码可以理解为:要生成 targer 需要依赖 prerequisites,通过执行command命令最终生死targer文件。
下面是一个简单的Makefile代码:
hello: hello.o
gcc hello.o -o hello
hello.o:hello.c
gcc -c hello.c -o hello.o
clean:
rm -rf hello *.o
运行结果:
步骤:
- make后内核找到了当前路径下的Makefile文件开始执行。
- 它会把第一个目标文件作为最终文件,也就是 hello 。
- 如果目标文件 (hello)不存在,或依赖文件 (hello.o) 的修改时间比目标文件要新,就会执行命令 (gcc …)。
- 先看hello.o 文件是否存在,若不存则找 hello.o 的依赖文件 hello.c 后执行命令生成 hello.o, 在执行最终目标文件。
- hello.c文件当然是存在的。
如果执行完后生成了 衍生文件 hello.o 和 我们要的目标文件 hello,当然hello.o并不是我们想要的,可以向我那样在Makefile中加入 clean 。在命令行输入make clean 便可删除 .o 文件。

3.变量
Mafile 的变量和我们代码中的宏差不多,Makfile到了要执行的的位置时会把变量填充进去。Makefile 引用变量是 用 $()。我们看下面的代码和运行结果便一目了然。
注:$^ 代表依赖集,即 依赖文件;$@ 代表目标集,即目标文件;$< 代表依赖目标文件
CC=gcc
CFLAGS=
OBJS=main.o mylinux1.o mylinux2.o
all:main
main:$(OBJS)
$(CC) $(CFLAGS) $^ -o $@
main.o:main.c
$(CC) $(CFLAGS) -c $< -o $@
mylinux1.o:mylinux1.c
$(CC) $(CFLAGS) -c $< -o $@
mylinux2.o:mylinux2.c
$(CC) $(CFLAGS) -c $< -o $@
clean:
rm -rf main *.o
运行结果:

4.指定文件路径
在我们写一个项目时,我们会把库文件放到 include 文件夹, 动态库/静态库放到 lib 文件夹下, 源代码则放到 src 文件夹下。这时想要编译代码,则必须指定文件路径。
1. VPATH
Makefile 文件中的特殊变量“VPATH”就是完成这个功能的,如果没有指明这个变量,make 只会在当前的目录中去找寻依赖文件和目标文件。
代码如下(示例):
1 VPATH=src:inc
2 CC=gcc
3 CFLAGS=
4 OBJS=main.o mylinux1.o mylinux2.o
5 all:main
6 main:$(OBJS)
7 $(CC) $(CFLAGS) $^ -o $@
8 main.o:main.c mylinux1.h mylinux2.h
9 $(CC) $(CFLAGS) -c $< -o $@
10 mylinux1.o:mylinux1.c mylinux1.h
11 $(CC) $(CFLAGS) -c $< -o $@
12 mylinux2.o:mylinux2.c mylinux2.h
13 $(CC) $(CFLAGS) -c $< -o $@
14 clean:
15 rm -rf main *.o
运行结果如下:
可以看到 VPATH 只会到了 src 目录,因为里面有 mian.c 文件后就不找了。这时我们可以用第二种方法。
2. 指定路径
我使用了变量来指定路径,如下:
运行结果:

3. vpath
它的使用方法有三种:
vpath <pattern> <directories>
为符合模式<pattern>的文件指定搜索目录<\directories>。
vpath <pattern>
清除符合模式的文件的搜索目录
vpath
清除所有已被设置好了的文件搜索目录。
4.嵌套make
有时候我们需要编译当前 Makefile 需要编译下层路径的makefile, 这时我们需要使用嵌套 make,代码如下
./

./test/

运行结果:

进行删除:

总结
以上就是我项目所需的内容。一些详细的知识等有空再出。
本文介绍了Makefile的基础知识,包括规则的命名和语法,如何使用变量,指定文件路径的方法(VPATH、vpath),以及如何进行嵌套make。通过示例代码解释了Makefile的工作原理和常见操作。
591

被折叠的 条评论
为什么被折叠?



