我使用自动变量($@,$^
)和模式(%
)编写了以下makefile,但它无法与gnu make一起使用:
TARGET = edit
SRCS = $(wildcard *.c)
OBJS = $(SRCS:%.c=%.o)
$(TARGET) : $(OBJS)
gcc $^ -o $(TARGET)
%.o : %.c
gcc $< -c $@
我在工作目录中有foo.c,bar.c。 错误是:
gcc foo.c -c foo.o
gcc: foo.o: No such file or directory
make: *** [foo.o] Error 1
我对automatic variables
和pattern rules
感到困惑,如何正确使用它们?他们有任何关系吗?
答案 0 :(得分:1)
你的统治是错误的。它应该是:
%.o : %.c
gcc -c $< -o $@
答案 1 :(得分:0)
如果您不是专家,那么带有所有这些符号的传统makefile语法就是cofusing。在makepp中,您可以使用自解释长名称(第二行不需要以制表符开头):
%.o : %.c
gcc -c $(input) -o $(ouptut)
至于你的问题:虽然这些变量对于避免冗余的所有规则都很有用,但它们对模式规则至关重要。你怎么知道你的许多输入文件目前正在编译中。
makepp还有很多。除了做几乎所有GNU make之外,还有更多有用的东西,你甚至可以通过一些Perl编程扩展你的makefile。