gpt4 book ai didi

c++ - makefile需要调用两次

转载 作者:行者123 更新时间:2023-11-28 07:06:53 26 4
gpt4 key购买 nike

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

最佳答案

构建.deps 文件的规则:

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

将无条件地创建 ${DEPS} 文件,即使 C++ 编译器的调用失败。 (使用 -o 可能会更好。)

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

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


还有,我不明白

INCLUDES= \
-I${SRC_DIR}

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

关于c++ - makefile需要调用两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21653589/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com