什么是C项目的最小Makefile?

时间:2017-06-26 08:56:16

标签: makefile

我发现很多答案,例如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

1 个答案:

答案 0 :(得分:1)

最低限度是:

all : a

a : a.o b.o c.o

clean :
    rm -f a a.o

.PHONY: all clean

它希望源文件a.cb.cc.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