考虑以下makefile:
all : a.vo a.glob
a.gl%b a.v% : a.v
touch a.glob a.vo
当我运行make -j2
时,我得到:
$ rm -f a.vo a.glob; make -j2
make: Circular a.v.o <- a.v dependency dropped.
touch a.glob a.vo
我知道为什么a.v.o
取决于a.v
,但我看不出a.v
取决于a.v.o
的方式。这种依赖性来自哪里(有没有办法禁用它)?
答案 0 :(得分:1)
当没有定义规则时,GNU make使用Implicit Rules。特别是,
n是通过C编译器运行链接器(通常称为ld)从n.o自动生成的。使用的精确配方是'$(CC)$(LDFLAGS)n.o $(LOADLIBES)$(LDLIBS)'。
如你所见:
~ $ cat Makefile
all: a.v
echo "foo"
a.v.o:
echo "bar"
~ $ make
echo "bar"
bar
cc a.v.o -o a.v
gcc: error: a.v.o: No such file or directory
gcc: fatal error: no input files
compilation terminated.
<builtin>: recipe for target 'a.v' failed
make: *** [a.v] Error 1
cc
已执行。