Makefile模式规则失败?

gol*_*ean 9 gnu-make

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

%.o:%.c
    gcc $< -o:$@
Run Code Online (Sandbox Code Playgroud)

这个规则由我添加.

但是当我确实犯了它时会给出一个错误,说没有规则来制作目标%.o并且不会构建目标.

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

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

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

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

谢谢,-AD.

bob*_*ogo 14

Make只使用模式规则作为一种后备.例如:

$ ls
Makefile
$ cat Makefile
%.o: %.c
    gcc $< -o $@
$ make
make: *** No targets.  Stop.
Run Code Online (Sandbox Code Playgroud)

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

$ make 1.o
make: *** No rule to make target `1.o'.  Stop.
Run Code Online (Sandbox Code Playgroud)

预期.1.c不存在,因此不考虑模式规则.让我们再试一次.

$ touch 1.c
$ make 1.o
gcc 1.c -o 1.o
Run Code Online (Sandbox Code Playgroud)

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

就个人而言,我非常不喜欢这些后备规则.我更喜欢明确地列出目标.就像是

file.o file2.o f.o: %.o: %.c
    ...
Run Code Online (Sandbox Code Playgroud)

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


Jer*_*ock 1

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