检查并编译跨多个目录的更改依赖项?

时间:2012-10-28 01:44:31

标签: c makefile gnu-make

我正在创建一个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。

1 个答案:

答案 0 :(得分:2)

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

$(OBJS): %.o : $(SRC)/%.c
    $(CC) $(CCFLAGS) $(INCLUDE) -c $<
相关问题