Makefile即使文件类型存在,也会跳过规则

时间:2016-10-07 23:58:04

标签: makefile

我有一个包含这些规则的makefile。

all: $(TARGET)
OBJECTS = file.o
  %.o: %.c
    $(COMPILER) -c $(FLAGS) &< -o C_$(basename $@).o
  %.o: %.s
    $(COMPILER) -c $(FLAGS) &< -o S_$(basename $@).o
... The Linker is then called with *.o to link all the object files

我在src目录中有相同的文件名file.c和file.s。但是make只运行目标文件的第一条规则。为什么它只编译一次?如果我的src文件夹中存在file.c和file.s,如何编译make?

我不想为不同的扩展程序创建不同的对象文件名。那太傻了。

有没有办法让我用.s和.c扩展名编译文件名?

我觉得make很容易做到这一点,我错过了一些东西。

感谢您的帮助。如果我不清楚,请告诉我,我会尝试更深入地解释它。

1 个答案:

答案 0 :(得分:0)

你误解了Make的工作原理。

构建目标的方法可能有很多种; Make将使用一个,而不是 all。无论如何,你的makefile违反了Mad Scientist's rules之一,因为你的模式规则不会构建它们声称要构建

%.o: %.c
    $(COMPILER) -c $(FLAGS) &< -o C_$(basename $@).o
%.o: %.s
    $(COMPILER) -c $(FLAGS) &< -o S_$(basename $@).o

第一个不构建foo.o,它构建C_foo.o;第二个不构建foo.o,它构建S_foo.o。我不知道您的关联规则是如何运作的,但如果它取决于foo.o,那么您就会陷入困境。

试试这个:

C_%.o: %.c
    $(COMPILER) -c $(FLAGS) &< -o $@
S_%.o: %.s
    $(COMPILER) -c $(FLAGS) &< -o $@

然后根据您认为应具备的先决条件提供链接规则。如果您希望它同时使用C_foo.oS_foo.o(这听起来不是一个好主意),那么请将它们放在先决条件列表中。