我有以下规则:
%.o: $(SRCDIR)%.S
$(CC) $(ASFLAGS) -c $< -o $(BINDIR)$@
除了动态创建其中一个源文件vectors.S
之外,它的效果很好。在运行以下规则之前,该文件不会存在:
vectors.S: $(SRCDIR)vectors.pl
$(SRCDIR)vectors.pl > $(SRCDIR)vectors.S
该规则创建文件src/vectors.S
。为什么以前的规则不适用于这个新文件? (而是使用默认的隐式规则)。我该怎么做才能申请?
作为参考,这是Makefile输出的示例:
gcc -m32 -gdwarf-2 -Wa,-divide -c src/swtch.S -o bin/swtch.o
gcc -m32 -gdwarf-2 -Wa,-divide -c src/trapasm.S -o bin/trapasm.o
src/vectors.pl > src/vectors.S
gcc -m32 -gdwarf-2 -Wa,-divide -c -o vectors.o vectors.S
gcc: error: vectors.S: No such file or directory
gcc: fatal error: no input files
compilation terminated.
make: *** [vectors.o] Error 4
- 更新 -
我设法通过为vectors.o
指定一个明确的规则来使它工作:
vectors.o: vectors.S
$(CC) $(ASFLAGS) -c $(SRCDIR)$< -o $(BINDIR)$@
我仍然很好奇为什么忽略自定义%.o: $(SRCDIR)%.S
规则并选择隐式选择......以及解决此问题的标准方法是什么(如果有的话)。
它被忽略,因为它没有构建正确的文件。
文件vector.S
与src/vector.S
不是同一个文件。你已经要求make通过将它列为先决条件来构建src/vector.S
,并且你已经定义了一个规则来告诉如何构建vector.S
,但是该规则没有用,因为那不是你想要构建的文件。
Makefile的第二条规则说,配方应该总是更新你告诉它的目标,即$@
。如果你的食谱更新的东西不仅仅是$@
,那就错了。
所以,你希望你的规则是这样的:
$(BINDIR)%.o: $(SRCDIR)%.S
$(CC) $(ASFLAGS) -c $< -o $@
$(SRCDIR)vectors.S: $(SRCDIR)vectors.pl
$(SRCDIR)vectors.pl > $@