C++ makefile需要调用两次
我在下面有这个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时,一切
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变量(我不确定我当时是怎么想的),它似乎已经修复了编译错误。它需要更长的时间来运行,但它不会失败一次,然后再工作下一次,这是绝对恼人。非常感谢!