1

我正在制作一个编译位于多个目录中的程序的makefile。所有源文件都在 /src 中,头文件在 /inc 中,目标文件将在 /obj 中创建,而可执行文件将在 /bin 中创建。makefile 共有三个,一个整体,一个在 /obj 目录,一个在 /bin 目录。obj makefile 创建目标文件,bin 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。

4

1 回答 1

2

在您的$(OBJS)规则中,每个目标文件都依赖于所有源文件,因此当您修改一个源文件时,Make 会重建所有对象。尝试这个:

$(OBJS): %.o : $(SRC)/%.c
    $(CC) $(CCFLAGS) $(INCLUDE) -c $<
于 2012-10-28T01:58:20.007 回答