我发现很多答案,例如this one,并没有使用隐式规则。
我能写的最小值是:
SRC = $(wildcard *.c)
OBJ = $(patsubst %.c, %.o, $(SRC))
EXEC=a.exe
all: $(EXEC)
$(EXEC): $(OBJ)
$(CC) $^ -o $@
clean:
$(RM) $(OBJ)
$(RM) $(EXEC)
但我相信我也可以删除链接部分。
是否可以再减少这个Makefile?
编辑
在Maxim Egorushkin的帮助下,我写了这个:
#Makefile
OBJS=$(patsubst %.c,%.o,$(wildcard *.c))
EXEC=a
$(EXEC): $(OBJS)
all : $(EXEC)
clean :
rm -f $(OBJS)
.PHONY: all clean
它确实构建了我的文件,但它没有链接任何内容:
$ make
cc -c -o bar.o bar.c
cc -c -o cow.o cow.c
cc -c -o foo.o foo.c
我应该改变什么?
虚拟源文件创建如下:
echo "int main() {return 0;}" > cow.c
touch foo.c bar.c cow.c
答案 0 :(得分:1)
最低限度是:
all : a
a : a.o b.o c.o
clean :
rm -f a a.o
.PHONY: all clean
它希望源文件a.c
,b.c
和c.c
生成可执行文件a
:
$ touch a.c b.c c.c
$ make
cc -c -o a.o a.c
cc -c -o b.o b.c
cc -c -o c.o c.c
cc a.o b.o c.o -o a
/usr/lib/gcc/x86_64-redhat-linux/5.3.1/../../../../lib64/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
collect2: error: ld returned 1 exit status
<builtin>: recipe for target 'a' failed
make: *** [a] Error 1
但是,您不会使用built-in GNU make rules生成自动标头依赖关系。 Extra 5 lines would be required for that