2013-04-06 191 views
0

我写了使用自动变量([email protected],$^)和模式(%)下面的Makefile,但它不能与GNU使工作:为什么这个makefile不能工作?

TARGET = edit 
SRCS = $(wildcard *.c) 
OBJS = $(SRCS:%.c=%.o) 
$(TARGET) : $(OBJS) 
    gcc $^ -o $(TARGET) 
%.o : %.c 
    gcc $< -c [email protected] 

我的foo.c,bar.c工作目录。 错误是:

gcc foo.c -c foo.o 
gcc: foo.o: No such file or directory 
make: *** [foo.o] Error 1 

我得到automatic variablespattern rules,如何准确使用它们如此混乱?他们有什么关系吗?

回答

1

你的规矩是错误的。它应该是:

%.o : %.c 
    gcc -c $< -o [email protected] 
+0

谢谢,我太粗心了!但为什么我用'gcc -c $ <-o $ @'替换'gcc -c $^-o $ @'时看不到任何区别? – 2013-04-06 08:30:34

+0

我不确定我了解您的回复。你仍然看到一个错误?你能用新的错误输出更新你的问题吗?你期望看到什么不同? – jszakmeister 2013-04-06 08:40:16

+0

我想你可能混淆了你所说的话。我想你的意思是“为什么我用'gcc -c $^-o $ @'替换'gcc -c $ <-o $ @'时看不到差异?因此,不要看第一个依赖关系,而是看看所有这些依赖关系。答案是每个'.o'文件只有一个依赖项:它来自的'.c'文件。所以在这种情况下'$ ^'和'$ <'没有区别。 – jszakmeister 2013-04-06 08:58:25

0

如果您不是专家,所有这些标记的传统makefile语法都是cofusing。在makepp您可以使用自己解释长文件名(与2号线并不需要开始一个标签):

%.o : %.c 
    gcc -c $(input) -o $(ouptut) 

至于你的问题:虽然这些变量是非常有用的所有规则,以避免冗余,他们在模式规则上是必不可少的你还有什么知道你的许多输入文件当前正在被编译的呢?

makepp还有很多。除了几乎所有的GNU make功能之外,还有更多有用的东西,甚至可以用一些Perl编程扩展makefile。