Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Makefile 要将所有.o文件放在一个目录中,但在编译第一个文件后停止_Makefile - Fatal编程技术网

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

Makefile 要将所有.o文件放在一个目录中,但在编译第一个文件后停止,makefile,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) $(CFLA

我希望有一个整洁的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 $@

如果Makefile确实与您发布的一样多,那么您将丢失
all:
规则。在没有明确的
all
规则的情况下,make假设要创建第一个当前规则,因此在此之后它将停止。为了实现您想要的,将其添加(追加)到Makefile(分别更改最终的可执行文件名):


默认情况下,
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}
中是否存在任何对象文件,这都是有效的;在目录中查找对象文件的通配符可确保已编译过一次的文件是最新的,但不会尝试构建以前编译失败的文件或根本不存在的文件。

如果执行
rm$DIR/*.o
,则不会重建任何文件。编译失败的东西也不会被重建——是吗?@JonathanLeffler我使用这种模式,它往往会工作。也许我这里有个打字错误?
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}