作用
linux作業系統除了核心外,還包含了其他開源軟體
我們常常需要使用make去編譯這些開源程式
而編寫Makefile,也是linux程式設計師的入門技術
原理
其實make不光只能用來編譯程式
它也是一門完整的函數式編程語言
支援遞洄式建構示意圖:
最左邊是我們想要的結果,也就是所謂的編譯目標
要將上圖寫成Makefile非常簡單
- 先寫出編譯目標 x.bin
x.bin
- 再寫出它是從哪裏來的
x.bin: a.o b.o libxy.a
代表x.bin是從
a.o
b.o
liborz.a
這三個檔案來的 - 再寫出轉變方法
x.bin: a.o b.o libxy.a g++ -o x.bin a.o b.o libxy.a
使用g++進行連結
- a.o
b.o
libxy.a
不會憑空出現,它們也是編譯目標a.o: a.cpp g++ -o a.o -c a.cpp b.o: b.cpp g++ -o b.o -c b.cpp libxy.a: x.o y.o ar rcs libxy.a x.o y.o
- x.o
y.o
也是編譯目標x.o : x.cpp g++ -o x.o -c x.cpp y.o : y.cpp g++ -o y.o -c y.cpp
- 最後的Makefile內容
x.bin: a.o b.o libxy.a g++ -o x.bin a.o b.o libxy.a a.o: a.cpp g++ -o a.o -c a.cpp b.o: b.cpp g++ -o b.o -c b.cpp libxy.a: x.o y.o ar rcs libxy.a x.o y.o x.o: x.cpp g++ -o x.o -c x.cpp y.o: y.cpp g++ -o y.o -c y.cpp
使用make執行Makefile,輸出以下內容
g++ -o a.o -c a.cpp g++ -o b.o -c b.cpp g++ -o x.o -c x.cpp g++ -o y.o -c y.cpp ar rcs libxy.a x.o y.o g++ -o x.bin a.o b.o libxy.a
簡化
上述的Makefile有一些重複內容
可以利用$@和$<符號簡化x.bin: a.o b.o libxy.a g++ -o $@ $< a.o : a.cpp g++ -o $@ -c $< b.o : b.cpp g++ -o $@ -c $< libxy.a: x.o y.o ar rcs $@ $< x.o : x.cpp g++ -o $@ -c $< y.o : y.cpp g++ -o $@ -c $<
$@ 代表編譯目標
$< 代表所有來源
通配符簡化
所有.o檔變換方式相同
所以可以使用通配符%簡化x.bin: a.o b.o libxy.a g++ -o $@ $< libxy.a: x.o y.o ar rcs $@ $< %.o: %.cpp g++ -o $@ -c $<
多行程
從示意圖可以知道,同一層的編譯目標互不相關
可同時編譯
a.o
b.o
libxy.a
可以fork成三個行程編譯
最後再連結成執行檔
利用-j使用多核心編譯make -j #儘量使用所有資源進行編譯 make -j4 #使用四行程進行編譯