我在下面有这个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)
答案 0 :(得分:1)
构建.deps
文件的规则:
${DEPS}: ${INC} ${SRC}
@${CXX} -M ${SRC} > ${DEPS}
即使调用C ++编译器失败,也将无条件地创建${DEPS}
文件。 (使用-o
可能会更好。)
它还缺少允许它查找头文件的-I
选项。
由于第二个错误,它将在运行时失败。作为第一个错误的结果,它仍然会创建一个.deps文件。第二次调用make
时,它不会触发${DEPS}
规则,因为.deps
文件比任何依赖项都新。
另外,我不明白
INCLUDES= \
-I${SRC_DIR}
这不正确(我认为:它应该是INC_DIR
,并且它缺少./lib/glm
),并且您不会在任何地方使用它。