有沒有人有一個完整的makefile,可以做到以下幾點:例makefile文件構建簡單的C項目重新編譯時標題更改
- 重建項目如果一個頭文件改變
- 的cpp文件中列出makefile文件
- 頭文件是不是在生成文件
- 的頭文件允許具有比cpp文件
- 一些cpp文件中沒有頭FIL不同的名稱上市es
我已經看到了關於如何使make工具找出頭文件依賴關係的說明,但是這些指令都沒有提供任何類似於工作示例的東西。一個簡單的例子如下:main.cpp C1.cpp C1.h C2.cpp C2.h
有沒有人有一個完整的makefile,可以做到以下幾點:例makefile文件構建簡單的C項目重新編譯時標題更改
我已經看到了關於如何使make工具找出頭文件依賴關係的說明,但是這些指令都沒有提供任何類似於工作示例的東西。一個簡單的例子如下:main.cpp C1.cpp C1.h C2.cpp C2.h
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命令是醜陋的,上面的方法幾乎適用於所有情況。)
您也可以使用CMake來做到這一點。你需要寫的一切是:
add_executable (exec main.cpp C1.cpp C2.cpp)
'cmake'不是'make',而'cmake'文件不是' makefile' –
我想你寫錯了:你的規則應該是'%.d:%.cpp'嗎?我也會謹慎的使用'* .d'而不是'$(SOURCES:.cpp = .d)'或其他任何東西,因爲前者在重命名/刪除源代碼時很容易中斷。 –
@TobySpeight:我可以告訴你沒有測試它。 – Beta
是的,我當然會測試它。這就是我知道當你刪除和/或重命名頭文件時,你會遇到一個依賴文件,該文件仍然會引用已刪除的頭文件,而如果你顯式地生成了依賴文件,那麼在makefile被認爲是完全讀取之前它們會被重新生成。你應該至少在你的'clean'目標中有'$(RM)* .d',以便進行某種最後的恢復。 –