Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.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
C++ makefile需要调用两次_C++_Makefile - Fatal编程技术网

C++ makefile需要调用两次

C++ makefile需要调用两次,c++,makefile,C++,Makefile,我在下面有这个makefile。虽然目前它可以正常编译,但我遇到了一个非常奇怪和乏味的问题,我必须运行make两次才能编译代码 第一次调用make,我收到以下错误: ./src/gravity.cpp:1:31: fatal error: gravity.h: No such file or directory compilation terminated. 我在OBJECTS=..下添加了更多的源文件,每个源文件都会重复该消息。当然,这表明我没有正确链接标题,只是当我再次运行make时,一切

我在下面有这个makefile。虽然目前它可以正常编译,但我遇到了一个非常奇怪和乏味的问题,我必须运行
make
两次才能编译代码

第一次调用
make
,我收到以下错误:

./src/gravity.cpp:1:31: fatal error: gravity.h: No such file or directory
compilation terminated.
我在
OBJECTS=..
下添加了更多的源文件,每个源文件都会重复该消息。当然,这表明我没有正确链接标题,只是当我再次运行
make
时,一切都顺利编译

一个有趣的观察结果可能是,
main.cpp
没有抱怨缺少
gravity.h
,但我不确定它是如何关联的

我的所有头文件都有头保护。如果它有帮助,这是一个C++ SDL/OpenGL应用程序。 我的makefile在下面。谢谢

OUTPUT_NAME = output_file
INC_DIR = ./inc
SRC_DIR = ./src
BIN_DIR = ./bin

INCLUDES= \
    -I${SRC_DIR}

SRC := $(shell find $(SRC_DIR) -name '*.cpp')
INC := $(shell find $(INC_DIR) -name '*.h')

CXX = g++
CXXFLAGS = -g -Wall -std=c++0x -I${INC_DIR} -I./lib/glm

LIBFLAGS = -lSDL -lGL -lGLU -lglut

OBJECTS = \
    ${BIN_DIR}/main.o \
    ${BIN_DIR}/gravity.o

DEPS = $(BIN_DIR)/${OUTPUT_NAME}.deps

all: ${DEPS} ${OUTPUT_NAME}

${DEPS}: ${INC} ${SRC}
    @${CXX} -M ${SRC} > ${DEPS}

${OUTPUT_NAME}: ${OBJECTS}
    ${CXX} ${CXXFLAGS} ${OBJECTS} -o ${OUTPUT_NAME} ${LIBFLAGS}

${OBJECTS}: ${BIN_DIR}/%.o : ${SRC_DIR}/%.cpp
    ${CXX} ${CXXFLAGS} $< -c -o $@

force:
    $(MAKE) fullclean
    $(MAKE)

clean:
    rm ${OBJECTS} ${OUTPUT_NAME}

fullclean:
    rm ${OBJECTS} ${DEPS} ${OUTPUT_NAME}

run:
    clear
    ./${OUTPUT_NAME}

style:
    astyle --style=java --indent=spaces=4 ${SRC} ${INC}

.PHONY: all clean fullclean run style force

include $(DEPS)
OUTPUT\u NAME=OUTPUT\u文件
公司目录=/公司
SRC_DIR=./SRC
BIN_DIR=/BIN
包括=\
-I${SRC_DIR}
SRC:=$(shell find$(SRC_DIR)-名称'*.cpp')
INC:=$(shell find$(INC_DIR)-名称'*.h')
CXX=g++
CXXFLAGS=-g-Wall-std=c++0x-I${INC_DIR}-I./lib/glm
LIBFLAGS=-lSDL-lGL-lGLU-lglut
对象=\
${BIN_DIR}/main.o\
${BIN_DIR}/gravity.o
DEPS=$(BIN_DIR)/${OUTPUT_NAME}.DEPS
全部:${DEPS}${OUTPUT\u NAME}
${DEPS}:${INC}${SRC}
@${CXX}-M${SRC}>${DEPS}
${OUTPUT_NAME}:${OBJECTS}
${CXX}${CXXFLAGS}${OBJECTS}-o${OUTPUT_NAME}${LIBFLAGS}
${OBJECTS}:${BIN_DIR}/%.o:${SRC_DIR}/%.cpp
${CXX}${CXXFLAGS}$<-c-o$@
部队:
$(使)完全清洁
$(制造)
清洁:
rm${OBJECTS}${OUTPUT\u NAME}
完全清洁:
rm${OBJECTS}${DEPS}${OUTPUT\u NAME}
运行:
清楚的
./${OUTPUT_NAME}
风格:
astyle--style=java--indent=spaces=4${SRC}${INC}
.虚假:全清洁全清洁跑步风格部队
包括美元(DEPS)

构建
.deps
文件的规则:

${DEPS}: ${INC} ${SRC}
    @${CXX} -M ${SRC} > ${DEPS}
即使C++编译器的调用失败,也会无条件地创建<代码> ${DEPS}< /Cord>文件。(最好使用
-o

它还缺少允许它查找头文件的
-I
选项

作为第二个错误的结果,它将在运行时失败。作为第一个错误的结果,它仍然会创建一个.deps文件。第二次调用
make
,它将不会触发
${DEPS}
规则,因为
.DEPS
文件比任何依赖项都新


还有,我不明白

INCLUDES= \
    -I${SRC_DIR}

它是不正确的(我认为:它应该是
INC\u DIR
,它缺少
/lib/glm
),而且你在任何地方都不使用它。

人们还在使用make吗!Gradle或SCONS更好,很多人仍然使用
make
@JonathanLeffler-哦,天哪。猜猜有人没听过这种新型机器上的无马马车和自行车?我知道自行车是什么…@JonathanLeffler-太棒了!我清理了我的DEPS和OUTPUT_NAME规则,并修复了INCLUDES变量(我不确定我当时是怎么想的),它似乎已经修复了编译错误。它需要更长的时间来运行,但它不会失败一次,然后再工作下一次,这是绝对恼人。非常感谢!