Makefile----简单编写

1.介绍


1.1 Markfile规则

target(目标文件) … : prerequisites(所需要的文件或是目标) …
command(编译规则)

核心的内容:target 这一个或多个的目标文件依赖于prerequisites 中的文件,其生成规则定义在 command 中。说白一点就是说,prerequisites中如果有一个以上的文件比 target 文件要新的话,command 所定义的命令就会被执行。这就是 Makefile 的规则。

1.2.举例

edit : main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
cc -o edit main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
main.o : main.c defs.h
cc -c main.c
kbd.o : kbd.c defs.h command.h
cc -c kbd.c
command.o : command.c defs.h command.h
cc -c command.c
display.o : display.c defs.h buffer.h
cc -c display.c
insert.o : insert.c defs.h buffer.h
...
clean :
rm edit main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o

清除:make clean,以此来清除所有的目标文件,以便重编译

1.3 变量

定义

objects = main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o

使用

$(objects)

1.4 GNU自动推导

只要 make 看到一个[.o]文件,它就会自动的把[.c]文件加在依赖关系中,如果 make
找到一个 whatever.o,那么 whatever.c,就会是 whatever.o 的依赖文件。并且 cc -c
whatever.c 也会被推导出来。所以上面的例子也可以像下面这样写:

objects = main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
edit : $(objects)
cc -o edit $(objects)
main.o : defs.h
kbd.o : defs.h command.h
command.o : defs.h command.h
display.o : defs.h buffer.h
insert.o : defs.h buffer.h
search.o : defs.h buffer.h
files.o : defs.h buffer.h command.h
utils.o : defs.h
.PHONY : clean   #表示clean是个伪目标文件
clean :
rm edit $(objects)

也可以像下面这样写,不过依赖关系显得很乱:

objects = main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
edit : $(objects)
cc -o edit $(objects)
$(objects) : defs.h
kbd.o command.o files.o : command.h
display.o insert.o search.o files.o : buffer.h
.PHONY : clean
clean :
rm edit $(objects)   #-rm edit $(objects):也许某些文件出现问题,但不要管,继续做后面的事

1.4 注释:

用“#”字,需要注意的是,makefile中的命令必须以【Tab】开始


2.书写规则

2.1 文件寻找

2.1.1 VPATH (注意这里是全大写)
  • Makefile 文件中的特殊变量“VPATH”,如果没有指明这个变量,make 只会在当前的目录中去找寻依赖文件和目标文件。如果定义了这个变量,那么,make就会在当当前目录找不到的情况下,到所指定的目录中去找寻文件了。
  • VPATH = src:../headers:上面的的定义指定两个目录,“src”和“…/headers”,make 会按照这个顺序进行搜
    索。目录由“冒号”分隔。(当然,当前目录永远是最高优先搜索的地方)
2.1.2 vpath(注意这里是全小写)
  • 1、vpath < pattern> < directories>:为符合模式的文件指定搜索目录。
  • 2、vpath < pattern >:清除符合模式的文件的搜索目录。
  • 3、vpath:清除所有已被设置好了的文件搜索目录。
    • vpath %.h ../headers:要求 make 在“…/headers”目录下搜索所有以“.h”结尾的文件。(如果某文件在当前目录没有找到的话)
    • vpath %.c foo
      vpath % blish
      vpath %.c bar:连续地使用 vpath 语句,make 会按照 vpath 语句的先后顺序来执行搜索

2.1 在规则中使用通配符

make 支持三各通配符:“*”,“?”和“[…]”。这是和 Unix 的 B-Shell 是相同的。 波浪号(“”)字符在文件名中也有比较特殊的用途。如果是“/test”,这就表示当前用户的$HOME 目录下的 test 目录。而“~hchen/test”则表示用户 hchen 的宿主目录下的 test 目录。

  • clean:rm -f *.o:清除当前目录下的所有.o文件

lpr -p ? t o u c h p r i n t ‘ ‘ ‘ : 这 个 例 子 说 明 了 通 配 符 也 可 以 在 我 们 的 规 则 中 , 目 标 p r i n t 依 赖 于 所 有 的 [ . c ] 文 件 。 其 中 的 “ ? touch print```:这个例子说明了通配符也可以在我们的规则中,目标 print 依赖于所有的[.c]文件。其中的“ ?touchprintprint[.c]?”是一个自动化变量

  • 注意:objects = *.o:这样写是错的,[*.o]不会展开,应该写成:objects := $(wildcard *.o)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值