makefile需要调用两次

时间:2014-02-09 00:26:54

标签: c++ makefile

我在下面有这个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)

1 个答案:

答案 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),并且您不会在任何地方使用它。