2014-02-19 25 views
2

有沒有人有一個完整的makefile,可以做到以下幾點:例makefile文件構建簡單的C項目重新編譯時標題更改

  1. 重建項目如果一個頭文件改變
  2. 的cpp文件中列出makefile文件
  3. 頭文件是不是在生成文件
  4. 的頭文件允許具有比cpp文件
  5. 一些cpp文件中沒有頭FIL不同的名稱上市es

我已經看到了關於如何使make工具找出頭文件依賴關係的說明,但是這些指令都沒有提供任何類似於工作示例的東西。一個簡單的例子如下:main.cpp C1.cpp C1.h C2.cpp C2.h

回答

5
CXX = g++ 

OBJECTS := main.o C1.o C2.o 

all: $(OBJECTS) 

%.o : %.cpp 
    $(CXX) $(CPPFLAGS) -Wall -MMD -c $< -o [email protected] 

-include *.d 

編輯:作爲TobySpeight指出,如果你建立一個目標文件,重命名或刪除的前提源文件或頭文件中的一個,這將無法正常工作,然後嘗試重建對象文件; .d文件仍然需要丟失的文件,並且構建將失敗。我忘了把線條處理這種情況下:

%.h: ; 
%.cpp: ; 

(這是有效的,但原油的更精確的方法是把一些sed命令在%.o規則,以便添加特定空規則的。 .d文件,每個前提條件之一,但sed命令是醜陋的,上面的方法幾乎適用於所有情況。)

+0

我想你寫錯了:你的規則應該是'%.d:%.cpp'嗎?我也會謹慎的使用'* .d'而不是'$(SOURCES:.cpp = .d)'或其他任何東西,因爲前者在重命名/刪除源代碼時很容易中斷。 –

+0

@TobySpeight:我可以告訴你沒有測試它。 – Beta

+0

是的,我當然會測試它。這就是我知道當你刪除和/或重命名頭文件時,你會遇到一個依賴文件,該文件仍然會引用已刪除的頭文件,而如果你顯式地生成了依賴文件,那麼在makefile被認爲是完全讀取之前它們會被重新生成。你應該至少在你的'clean'目標中有'$(RM)* .d',以便進行某種最後的恢復。 –

0

您也可以使用CMake來做到這一點。你需要寫的一切是:

add_executable (exec main.cpp C1.cpp C2.cpp) 
+1

'cmake'不是'make',而'cmake'文件不是' makefile' –

相關問題