2013-03-08 83 views
0

我看過了,發現幾個答案看起來像是與這個問題有關,但似乎沒有任何幫助。使用C++的自動刪除功能

這是通常的故事 - 我有一個.hpp和.cpp文件的文件夾,我想將它們編譯爲.o文件,然後只有在文件所依賴的文件被更改時才重新編譯文件。

我目前的Makefile:

SRCS = $(shell find ../Includes/ -name "*.cpp") 
DEPS = $(SRCS:.cpp=.d) 
OBJS = $(SRCS:.cpp=.o) 

all: $(DEPS) $(OBJS) 

# Create the dependency files 
%.d : %.cpp 
    clang++ -MM $< -o [email protected] -c -std=c++11 

# Include the dependency files 
include $(DEPS) 

# Compile the source files 
%.o : %.cpp 
    clang++ -c -Wall -std=c++11 $< -o [email protected] 

我這個跑幾次(之前我運行make所以存在依賴文件,當我包括他們絕對應該存在)。我也嘗試將%.d添加到%.o的依賴項中。

基本上所有這一切發生的是'touch'ing .cpp導致.o和.d文件被重新生成,並且觸摸.hpp文件(在.d文件中列出的其他文件) 什麼也沒做。

舉例相關文件:

SomeFile.o : ../Includes/SomeFile.cpp \ 
    ../Includes/SomeFile.hpp ../Includes/SomeOtherFile.hpp 
+1

在依賴文件中,哪些目錄連接到hpp文件名? – NovaDenizen 2013-03-08 12:44:21

+0

隨着我給你的代碼,依賴文件沒有爲hpp文件生成(我剛纔給出了一個嘗試,似乎沒有幫助),我編輯我的問題給一個示例d文件。 – Peter 2013-03-08 13:13:20

+0

也許scons的將是你一個更好的工具 - http://www.scons.org – 2013-03-08 13:19:48

回答

0

事實證明,我是爲創建規則:

SomeFile.o : ... 

而我需要一個規則:

../Includes/SomeFile.o : ... 

感謝NovaDenizen誰讓我走上正確的道路。

1

除了路徑問題,我發現沿途創建依賴關係更自然,即使用-MD-MMD標誌。這樣你就不需要規則來更新依賴文件。

CPPFLAGS += -MMD 

TARGET := hello 

.DEFAULT: all 
all: $(TARGET) 

SRCS := $(shell find . -type f -name "*.cpp") 
OBJS := $(SRCS:.cpp=.o) 
DEPS := $(SRCS:.cpp=.d) 

hello: $(OBJS) 
     $(LINK.cc) -o [email protected] $^ 

-include $(DEPS) 
+0

我已經寫了關於這個問題的一次評論教程,這仍然是(由他人)維護在http://wiki.osdev.org/Makefile。 – DevSolar 2013-03-08 13:41:12