今天我在尝试调整依赖规则时,发现makefile的一个实现和我想像的不一样,以下是一个缩减过的makefile:
all : liba.a
liba.a : $(OBJS)
ar -q $@ lt;
OBJS = a.o
.c.o :
gcc -o $@ -c lt;
注:其中a.c只是一个最简单的hello world程序。
编译时会直接链接a.o,结果找不到该文件。让人感觉liba.a依赖于$(OBJS)没有检查后面的依赖对象就直接执行命令了。
如果我们将OBJS移动到liba.a依赖规则之前,则没有任何问题。也就是说,虽然make中采用=赋值的变量是无序的(即和定义的顺序无关),但是依赖规则中使用的变量看来是有序的。变量必须先于使用依赖规则的变量定义。
我尚不知这是gmake的特性还是本版本gmake的bug,抑或是make的约定。但是需要确认的一点是,有必要保障变量先于规则定义。
没有评论:
发表评论