0

我希望有一个包含显式依赖项的简洁生成文件,但将所有 .o 对象放在一个单独的目录中,以便稍后将其完全链接(在另一个文件中)。

问题是我的 make 在编译第一个源代码后停止,然后停止而没有任何错误。

CC=gcc
CFLAGS=-c -Wall -pedantic -std=c99

DIR=../obj

$(DIR)/CList.o : CList.c CList.h CList_aux.h Observation.h CList_View_aux.h
    $(CC) $(CFLAGS) CList.c -o $@
$(DIR)/CList_aux.o : CList_aux.c CList.h CNode.h
    $(CC) $(CFLAGS) CList_aux.c -o $@
$(DIR)/CList_View_aux.o : CList_View_aux.c CNode.h Observation.h
    $(CC) $(CFLAGS) CList_View_aux.c -o $@
$(DIR)/CNode.o : CNode.c CNode.h CNode_aux.h Observation.h CList.h
    $(CC) $(CFLAGS) CNode.c -o $@
$(DIR)/CNode_aux.o : CNode_aux.c CNode.h Observation.h
    $(CC) $(CFLAGS) CNode_aux.c -o $@
$(DIR)/Observation.o : Observation.c Observation.h Observation_aux.h CNode.h
    $(CC) $(CFLAGS) Observation.c -o $@
$(DIR)/Observation_aux.o : Observation.c Observation.h
    $(CC) $(CFLAGS) Observation_aux.c -o $@
$(DIR)/Record.o : Record.c Record.h Observation.h
    $(CC) $(CFLAGS) Record.c -o $@
4

2 回答 2

0

默认情况下,make构建 makefile 中的第一个目标。在这种情况下,即${DIR}/CList.o

您需要一个不同的第一个目标,通常称为all

OBJECTS = \
    $(DIR)/CList.o \
    $(DIR)/CList_aux.o \
    $(DIR)/CList_View_aux.o \
    $(DIR)/CNode.o \
    $(DIR)/CNode_aux.o \
    $(DIR)/Observation.o \
    $(DIR)/Observation_aux.o

all: ${OBJECTS}

请注意,无论是否有任何目标文件,这都有效${DIR};在目录中查找目标文件的通配符可确保那些已经编译过一次的文件是最新的,但不会尝试构建那些以前编译失败或根本不存在的文件。

于 2012-10-18T20:34:47.567 回答
0

如果 Makefile 真的和你发布的一样多,那么你就错过了all:规则。在没有明确all规则的情况下,make 假定要制定第一个当前规则,因此它在此之后停止。为了实现您想要的,将其添加(附加)到 Makefile(分别更改最终的可执行文件名称):

OBJECTS = $(wildcard $(DIR)/*.o)

all: $(EXECUTABLE)

$(EXECUTABLE): $(OBJECTS)
        $(LD) $(LDFLAGS) -o $@ $^
于 2012-10-18T20:26:27.977 回答