我有一个包含这些规则的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很容易做到这一点,我错过了一些东西。
感谢您的帮助。如果我不清楚,请告诉我,我会尝试更深入地解释它。
答案 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.o
和S_foo.o
(这听起来不是一个好主意),那么请将它们放在先决条件列表中。