2014-02-09 35 views
0

我在下面有這個makefile。雖然它目前編譯正確,但我遇到了一個非常奇怪且乏味的問題,我必須運行兩次make來編譯代碼。makefile需要被調用兩次

我第一次打電話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 [email protected] 

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

人們還在使用make! Gradle或SCONS更好 –

+0

是的,很多人仍然使用'make'。 –

+0

@JonathanLeffler - 哦,親愛的。猜猜有些沒有聽說過這種新式的機器馬少車 –

回答

1

的規則來構建.deps文件:

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

將無條件創建${DEPS}文件,即使C++編譯器的調用失敗。 (使用-o可能會更好。)

它也缺少-I選項,它允許它查找頭文件。

由於第二個錯誤,運行時會失敗。由於第一個錯誤,它將創建一個.deps文件。第二次調用make時,它將不會觸發${DEPS}規則,因爲.deps文件比任何依賴項都要新。


另外,我不明白

INCLUDES= \ 
    -I${SRC_DIR} 

這不是正確的(我認爲:這應該是INC_DIR,並且它缺少./lib/glm),你不任何地方使用它。

+0

太棒了!我清理了我的DEPS和OUTPUT_NAME規則並修復了INCLUDES變量(我不確定我在那裏想什麼),並且它似乎修復了編譯錯誤。運行需要更長的時間,但是一旦下一次工作就不會失敗,這是非常煩人的。謝謝一堆! – dBlisse