Makefile的使用

本文介绍了Makefile的基础知识,包括规则的命名和语法,如何使用变量,指定文件路径的方法(VPATH、vpath),以及如何进行嵌套make。通过示例代码解释了Makefile的工作原理和常见操作。


前言

因为在做项目时用到了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

运行结果:
在这里插入图片描述步骤:

  1. make后内核找到了当前路径下的Makefile文件开始执行。
  2. 它会把第一个目标文件作为最终文件,也就是 hello 。
  3. 如果目标文件 (hello)不存在,或依赖文件 (hello.o) 的修改时间比目标文件要新,就会执行命令 (gcc …)。
  4. 先看hello.o 文件是否存在,若不存则找 hello.o 的依赖文件 hello.c 后执行命令生成 hello.o, 在执行最终目标文件。
  5. 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/
在这里插入图片描述
运行结果:
在这里插入图片描述
进行删除:
在这里插入图片描述

总结

以上就是我项目所需的内容。一些详细的知识等有空再出。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值