2011-03-01 122 views
8

在使用的GNU-make,我的Makefile有一些模式规则:Makefile模式规则失败?

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

此规则由我添加。

但是,当我做它会给出一个错误说没有规则,使目标%.o,并不建立目标。

有时,还有其他的行为。当我说第一次做make时它没有建立目标(它给出错误说没有规则做目标),但是当我说再次make时,它确实建立了。

因此,当我明确指定每个源文件分开,然后它自己建立目标罚款第一次。

编辑:我在Centos上使用GNU-make(v6.3我猜,不知道)。这可能是一些权限/用户ID /组ID问题?

任何指标了解可能发生的事情和解决方案?

谢谢, -AD。

+0

这里有完全相同的问题。上帝,我创造了文件,​​他们的愚蠢语法和任意限制。 – antred

回答

2

您可能需要在规则第一行的:周围有空格。另外,gcc不会在输出文件名之前冒号;只需使用-o [email protected]即可。

+0

@Ok这些是我的错别字。 Makefile没有任何错误。仍然问题仍然存在.. – goldenmean

+0

你可以尝试'make -d'在你的目标上吗?它发出了很多输出,但你可以看到它正在尝试什么规则,也许看到了什么错误。如果您认为这有助于诊断问题,您也可以发布结果。 –

12

仅使用模式规则作为一种回退。例如:

$ ls 
Makefile 
$ cat Makefile 
%.o: %.c 
    gcc $< -o [email protected] 
$ make 
make: *** No targets. Stop. 

这很好。 Make不考虑模式规则,因为您没有要求它做任何事情,并且makefile中没有默认目标。让我们要求它做一些可能使用模式规则的东西。

$ make 1.o 
make: *** No rule to make target `1.o'. Stop. 

预计。 1.c不存在,所以不考虑模式规则。让我们再试一次。

$ touch 1.c 
$ make 1.o 
gcc 1.c -o 1.o 

(然后有一些关于main被丢失的错误)。

我个人很不喜欢这些备用规则。我更愿意明确列出目标。类似于

file.o file2.o f.o: %.o: %.c 
    ... 

为您提供了目标特定模式规则。这些完全不同(参见手册)。 [噢,这个模式并没有给你带来好处。]

0

刚刚遇到了这个问题。

如果这是您的规则:

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

请确保您有一个标签,而不是在之前的GCC第二行的空间。花了我几个小时弄清楚。 也不是':'在-o标志之后,正如其他人指出的那样。

0

确定.c文件存在吗?我认为使用前面建议的-d应该有助于调试。