makefile 需要调用两次
makefile needs to be called twice
我在下面有这个制作文件。虽然它目前可以正确编译,但我遇到了一个非常奇怪和乏味的问题,我必须运行两次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
),并且您不会在任何地方使用它。
相关文章:
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- C++析构函数调用两次,堆栈分配的复合对象
- Qt插槽调用了两次
- 对于优化级别为 0 的 std::vector,析构函数被调用两次
- 为什么转换运算符调用复制构造函数两次,而等效函数只调用它一次
- 调用一个小函数两次(例如在if条件和主体中)比将结果存储在局部变量中更可取
- 为什么这个自定义分配器的析构函数在 GCC/MSVS 的 stdlib 中被调用两次
- 插槽调用了两次qt
- 调用某个回调函数两次会导致分段错误:Nan
- 基于 MFC 对话框的应用程序无法调用对话框两次
- 重载运算符 new(),为什么构造函数被调用两次?
- 当 reset() 被unique_ptr调用两次时会发生什么?
- 为什么在C 中超载邮政增量运算符两次调用构造函数
- 现代C++编译器是否能够避免在某些条件下两次调用常量函数
- 如果我对async_read进行两次调用,那么只有在处理完第一次调用之后,才会处理第二次调用,这是否安全
- 如何正确地将对象添加到向量,而无需两次调用析构函数
- boost::asio vs. libpcap:避免两次调用关闭
- 为什么 DNSServiceProcessResult 两次调用我的回调
- 在资源管理器左窗格上两次调用Windows 7外壳扩展dll Initialize方法
- 通过连续两次调用boost::asio::read来检索正确的数据