Makefile变量
上面示例的Makefile在实际中是几乎不存在的,因为它过于简单,仅包含两个文件和一
个命令,在这种情况下完全不必要编写Makefile 而只需在Shell 中直接输入即可,在实际中
使用的Makefile往往是包含很多的文件和命令的,这也是Makefile产生的原因。下面就可给
出稍微复杂一些的Makefile进行讲解:
sunq:kang.o yul.o
Gcc kang.o yul.o -o sunq
kang.o : kang.c kang.h head.h
Gcc –Wall –O -g –c kang.c -o kang.o
yul.o : yul.c head.h
Gcc - Wall –O -g –c yul.c -o yul.o
在这个Makefile中有3 个目标体(target),分别为sunq、kang.o和yul.o,其中第一个目
标体的依赖文件就是后两个目标体。如果用户使用命令“make sunq”,则make管理器就是找
到sunq目标体开始执行。
这时,make会自动检查相关文件的时间戳。首先,在检查“kang.o”、“yul.o”和“sunq”
3 个文件的时间戳之前,它会向下查找那些把“kang.o”或“yul.o”作为目标文件的时间戳。
下面给出了上例中用变量替换修改后的Makefile,这里用OBJS代替kang.o和yul.o,用
CC代替Gcc,用CFLAGS代替“-Wall -O –g”。这样在以后修改时,就可以只修改变量定义,
而不需要修改下面的定义实体,从而大大简化了Makefile维护的工作量。
经变量替换后的Makefile如下所示:
OBJS = kang.o yul.o
CC = Gcc
CFLAGS = -Wall -O -g
sunq : $(OBJS)
$(CC) $(OBJS) -o sunq
kang.o : kang.c kang.h
$(CC) $(CFLAGS) -c kang.c -o kang.o
yul.o : yul.c yul.h
$(CC) $(CFLAGS) -c yul.c -o yul.o
Makefile中常见自动变量
命 令 格 式 含 义
$*
$+
$<
$?
$@
$^
$%
自动变量的书写比较难记,但是在熟练了之后会非常的方便,请读者结合下例中的自动
变量改写的Makefile进行记忆。
OBJS = kang.o yul.o
CC = Gcc
CFLAGS = -Wall -O -g
sunq : $(OBJS)
$(CC) $^ -o $@
kang.o : kang.c kang.h
$(CC) $(CFLAGS) -c $< -o $@
yul.o : yul.c yul.h
$(CC) $(CFLAGS) -c $< -o $@