Makefile 为什么可以';这个文件不行吗?
我使用自动变量(Makefile 为什么可以';这个文件不行吗?,makefile,gnu-make,Makefile,Gnu Make,我使用自动变量($@,$^)和模式(%)编写了以下makefile,但它不能与gnu make一起使用: TARGET = edit SRCS = $(wildcard *.c) OBJS = $(SRCS:%.c=%.o) $(TARGET) : $(OBJS) gcc $^ -o $(TARGET) %.o : %.c gcc $< -c $@ 我对自动变量和模式规则非常困惑,如何准确地使用它们?他们之间有什么关系吗?你的规则是错误的。应该是: %.o : %.c
$@,$^
)和模式(%
)编写了以下makefile,但它不能与gnu make一起使用:
TARGET = edit
SRCS = $(wildcard *.c)
OBJS = $(SRCS:%.c=%.o)
$(TARGET) : $(OBJS)
gcc $^ -o $(TARGET)
%.o : %.c
gcc $< -c $@
我对
自动变量
和模式规则
非常困惑,如何准确地使用它们?他们之间有什么关系吗?你的规则是错误的。应该是:
%.o : %.c
gcc -c $< -o $@
%.o:%.c
gcc-c$<-o$@
如果您不是专家,那么传统的makefile语法与所有这些符号都会相互影响。在中,您可以使用自我解释的长名称(第二行不需要以选项卡开头):
至于你的问题:虽然这些变量在所有规则中都很有用,可以避免冗余,但在模式规则中它们是必不可少的。否则,您将如何知道当前正在编译的输入文件中的哪一个
还有很多事情要做。除了做GNU make所能做的几乎所有事情外,还有很多有用的事情,您甚至可以通过一些Perl编程来扩展make文件。谢谢,我太粗心了!但是为什么我看不出用
gcc-c$<-o$@
替换gcc-c$<-o$@
时有什么不同?我不确定我是否理解您的回答。你仍然看到一个错误?你能用新的错误输出更新你的问题吗?你希望看到什么不同?我想你可能把你说的话弄混了。我想你的意思是“当我用gcc-c$^-o$@
替换gcc-c$^-o$@
时,为什么我看不出有什么不同?”因此,不要看第一个依赖项,而是看所有依赖项。答案是每个.o
文件只有一个依赖项:它来自的.c
文件。所以$^
和$
%.o : %.c
gcc -c $< -o $@
%.o : %.c
gcc -c $(input) -o $(ouptut)