介紹一下Makefile的簡單編寫例子。函數
編寫Makefile的規則就是:code
目標文件:依賴文件 (tab)編譯規則
如今我有一個文件目錄結構爲:blog
解釋一下這幾個文件。首先我建立makefile目錄,底下有一個include目錄和src目錄。include目錄存放一個head.h頭文件,是咱們src中全部cpp文件都要引用的頭文件。編譯
這四個cpp文件就是實現加減乘除的功能。把add.cpp看一下就知道了:變量
#include "head.h" int add(int a, int b) { return a + b; }
其他都同樣,作各自的運算而已。而main.cpp中我調用了它們:file
int main(int argc, char const *argv[]) { printf("sum = %d\n", add(10, 3)); printf("mul = %d\n", mul(10, 3)); printf("sub = %d\n", sub(10, 3)); printf("div = %lf\n", div(10, 3)); return 0; }
如今咱們要實現的功能就很明瞭了,編譯這幾個cpp,生成一個可執行文件,使得咱們可以正確運行結果。這裏面我寫了兩個Makefile文件,第一個是Makefile_SB(更名以後),這個用來理解makefile的編寫規則頗有用:引用
main:main.o add.o mul.o sub.o div.o g++ -o main add.o mul.o sub.o div.o main.o main.o:main.cpp g++ -c -I ../include main.cpp add.o:add.cpp ../include/head.h g++ -c -I ../include add.cpp mul.o:mul.cpp ../include/head.h g++ -c -I ../include mul.cpp sub.o:sub.cpp ../include/head.h g++ -c -I ../include sub.cpp div.o:div.cpp ../include/head.h g++ -c -I ../include div.cpp .PHONY:clean clean: rm -f *.o
以上,咱們遵循咱們的規則:gc
目標文件:依賴文件 (tab)編譯規則
首先,main是咱們最後要生成的可執行文件,它依賴於全部的.o文件,編譯規則就是直接g++ -o .o文件便可。im
而後,咱們的.o文件呢,又依賴於.c文件,因此下面也要寫。其中要注意,頭文件在上層目錄的include下,因此要加上:makefile
-I ../include
至於.PHONY,是一個僞目標,咱們真正的目標都是會生成的,而clean只是咱們清除文件使用的,它並不生成一個目標文件,因此咱們使用僞目標來執行這個命令。
在我目錄下的Makefile文件,纔是我最後使用的那個文件:
#獲取.cpp文件 SrcFiles=$(wildcard *.cpp) #使用替換函數獲取.o文件 ObjFiles=$(patsubst %.cpp,%.o,$(SrcFiles)) #生成的可執行文件 all:main #目標文件依賴於.o文件 main:$(ObjFiles) g++ -o $@ -I ../include $(SrcFiles) #.o文件依賴於.cpp文件,通配使用,一條就夠 %.o:%.cpp g++ -c -I ../include $< .PHONY:clean all clean: rm -f *.o rm -f main
有了咱們上面的規則講解以後,這個就能很好的理解。先介紹兩個函數:
而SrcFiles和ObjFiles都是變量,它不用特別的定義,直接寫出來就是定義了。
再寫一下其它符號的意義,記住就好了: