想要将所有.o文件放入目录中,但在编译第一个文件后停止

时间:2012-10-18 20:20:51

标签: makefile

我希望有一个包含显式依赖关系的整洁的makefile,但是将所有.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 $@

2 个答案:

答案 0 :(得分:0)

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

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

all: $(EXECUTABLE)

$(EXECUTABLE): $(OBJECTS)
        $(LD) $(LDFLAGS) -o $@ $^

答案 1 :(得分: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}中是否有任何目标文件,这都有效;在目录中查找目标文件的通配符可以确保那些已经编译过一次的文件是最新的,但是不会尝试构建那些以前无法编译的文件,或者根本不存在。