make簡易使用手冊

作用

linux作業系統除了核心外,還包含了其他開源軟體
我們常常需要使用make去編譯這些開源程式
而編寫Makefile,也是linux程式設計師的入門技術

原理

其實make不光只能用來編譯程式
它也是一門完整的函數式編程語言
支援遞洄式建構

示意圖:

make

最左邊是我們想要的結果,也就是所謂的編譯目標
要將上圖寫成Makefile非常簡單

  1. 先寫出編譯目標 x.bin
    x.bin
    
  2. 再寫出它是從哪裏來的
    x.bin: a.o b.o libxy.a
    

    代表x.bin是從
    a.o
    b.o
    liborz.a
    這三個檔案來的

  3. 再寫出轉變方法
    x.bin: a.o b.o libxy.a
         g++ -o x.bin a.o b.o libxy.a
    

    使用g++進行連結

  4. 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
    
  5. 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
    
  6. 最後的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  #使用四行程進行編譯