我正在创建一个makefile,它编译位于多个目录中的程序。所有源文件都在/ src中,头文件在/ inc中,目标文件将在/ obj中创建,可执行文件将在/ bin中创建。有三个makefile,一个整体,一个在/ obj目录中,一个在/ bin目录中。 obj makefile创建目标文件,bin makefile链接创建可执行文件的文件。我不应该对值进行硬编码,因为这个makefile需要尽可能通用,这包括硬编码文件和目录名。
下面的代码是创建目标文件的makefile。它会创建目标文件,但不会正确检查依赖项,因此当我更新一个文件时,它将重新创建所有目标文件。我一直在阅读GNU Makefile手册,但仍然不明白出了什么问题。
CC:= gcc
CCFLAGS:= -MMD -g -Wall
INCLUDE:= -I "../inc"
LDFLAGS:= -lcurses -lgdbm -lncurses -lgdbm_compat
SRC:= ../src
SOURCES:= $(wildcard $(SRC)/*.c)
OBJS:=$(patsubst $(SRC)/%.c,%.o,$(SOURCES))
all: $(OBJS)
$(OBJS): $(SOURCES)
$(CC) $(CCFLAGS) $(INCLUDE) -c $^
VPATH= ../$(PROG)
$(SOURCES):
$(CC) $(CC_FLAGS) $(INCLUDE) -c $<
.PHONY: clean
clean:
rm -f *.[od] *.o
-include *.d
如果需要,我可以发布其他两个makefile。
答案 0 :(得分:2)
在您$(OBJS)
规则中,每个对象文件都依赖于所有源文件,因此当您修改一个源文件时,请重建所有对象。试试这个:
$(OBJS): %.o : $(SRC)/%.c
$(CC) $(CCFLAGS) $(INCLUDE) -c $<