Makefile簡單編寫例項
阿新 • • 發佈:2018-11-29
介紹一下Makefile的簡單編寫例子。
編寫Makefile的規則就是:
目標檔案:依賴檔案
(tab)編譯規則
現在我有一個檔案目錄結構為:
解釋一下這幾個檔案。首先我建立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中我呼叫了它們:
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
以上,我們遵循我們的規則:
目標檔案:依賴檔案
(tab)編譯規則
首先,main是我們最後要生成的可執行檔案,它依賴於所有的.o檔案,編譯規則就是直接g++ -o .o檔案即可。
然後,我們的.o檔案呢,又依賴於.c檔案,所以下面也要寫。其中要注意,標頭檔案在上層目錄的include下,所以要加上:
-I ../include
至於.PHONY,是一個偽目標,我們真正的目標都是會生成的,而clean只是我們清除檔案使用的,它並不生成一個目標檔案,所以我們使用偽目標來執行這個命令。
簡潔編寫,使用函式
在我目錄下的Makefile檔案,才是我最後使用的那個檔案:
#獲取.cpp檔案
SrcFiles=$(wildcard *.cpp)
#使用替換函式獲取.o檔案
ObjFiles=$(patsubst %.cpp,%.o,$(SrcFiles))
#生成的可執行檔案
all:main
#目標檔案依賴於.o檔案
main:$(ObjFiles)
g++ -o [email protected] -I ../include $(SrcFiles)
#.o檔案依賴於.cpp檔案,通配使用,一條就夠
%.o:%.cpp
g++ -c -I ../include $<
.PHONY:clean all
clean:
rm -f *.o
rm -f main
有了我們上面的規則講解之後,這個就能很好的理解。先介紹兩個函式:
- wildcard函式,就是獲取指定的檔案
- patsubst函式,有替換功能。
而SrcFiles和ObjFiles都是變數,它不用特別的定義,直接寫出來就是定義了。
再寫一下其它符號的意義,記住就行了:
- $(Files),取File變數的值。
- [email protected] 目標檔案
- $^ 全部依賴
- $< 第一個依賴
- $? 第一個變化的依賴