Makefile模式规则失败?

时间:2011-03-01 14:01:34

标签: gnu-make

使用GNU-make时,我的Makefile有一些模式规则:

%.o:%.c
    gcc $< -o:$@

此规则由我添加。

但是当我确实犯了错误时说错误说没有规则来制作目标%.o并且没有构建目标。

有时,还有其他行为。当我说第一次做时它没有建立目标(它给出错误说没有规则来制作目标),但是当我说立即再做时,它确实构建正确。

因此,当我明确指定每个源文件时,它会首次自行构建目标。

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

有什么指示可以了解可能发生的事情和解决方案吗?

谢谢你, -AD。

5 个答案:

答案 0 :(得分:13)

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

$ ls
Makefile
$ cat Makefile
%.o: %.c
    gcc $< -o $@
$ 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

(然后关于主要缺失的一些错误)。

我个人非常不喜欢这些后备规则。我更喜欢明确地列出目标。像

这样的东西
file.o file2.o f.o: %.o: %.c
    ...

为您提供目标特定模式规则。这些是完全不同的(参见手册)。 [哦,这个模式在这个点头的例子中没有任何优势。]

答案 1 :(得分:2)

您可能需要在规则第一行的:周围留出空格。此外,gcc在输出文件名之前不带冒号;只需使用-o $@

答案 2 :(得分:0)

刚刚解决了这个问题。

如果这是你的规则:

%.o:%.c
    gcc $< -o:$@

确保在gcc之前的第二行有一个制表符而不是空格。花了几个小时才弄明白。 在-o标志之后也没有':',正如其他人指出的那样。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

如果您只将其放入Makefile并调用 make

%.o: %.cpp
  g++ -g -o $@ -c $<

它告诉:make: *** No targets. Stop.

因为它不是目标。这是一条规则。

如果您的其他目标需要 .o 文件,则会有效。

main.exe: main.o add.o
  g++ -g -o $@ $^

%.o: %.cpp
  g++ -g -o $@ -c $<