makefile 需要调用两次

makefile needs to be called twice

本文关键字:两次 调用 makefile      更新时间:2023-10-16

我在下面有这个制作文件。虽然它目前可以正确编译,但我遇到了一个非常奇怪和乏味的问题,我必须运行两次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 应用程序。

我的制作文件在下面。谢谢!

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)

构建.deps文件的规则:

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

将无条件地创建${DEPS}文件,即使C++编译器的调用失败也是如此。(最好使用-o

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

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


另外,我不明白

INCLUDES= 
    -I${SRC_DIR}

这是不正确的(我认为:它应该是INC_DIR的,并且缺少./lib/glm),并且您不会在任何地方使用它。