管理函式庫實例

  1. 先複製 makefile2 成 makefile3,新增變數 MYLIB = mylib.a,新增目標項目 mylib.a,其相依項目包含 2.o 及 3.o,但沒有給產生法則。
    [dywang@dyw219 make1]$ cp makefile2 makefile3
    [dywang@dyw219 make1]$ vim makefile3
    [dywang@dyw219 make1]$ grep MYLIB -A1 makefile3
    MYLIB = mylib.a
    
    main: main.o $(MYLIB)
    	$(CC) -o $@ $(OBJS)
    $(MYLIB): $(MYLIB)(2.o) $(MYLIB)(3.o)
    main.o: main.c a.h
    
  2. 查詢以 makefile3 執行 make 的預設法則,過濾變數 AR = ar, ARFLAGS =rv。
    [dywang@dyw219 make1]$ make -p -f makefile3 | sed '/^#/d' | sed '/^$/d' | grep "^AR.*=" --color
    ARFLAGS = rv
    AR = ar
    
  3. 再查詢以 makefile3 執行 make 的預設法則,過濾 mylib.a,找到目標項目 mylib.a(2.o), mylib.a(3.o) 的預設法則是 $(AR) $(ARFLAGS) $@ $<。其中變數為:
    1. $(AR): ar
    2. $(ARFLAGS): rv
    3. $< 代表目前的相依性項目,目標項目 mylib.a(2.o) 的相依項目就是 2.o;目標項目 mylib.a(3.o) 的相依項目則是 3.o。
    4. $@ 代表目前的目標項目,就是 mylib.a 函式庫。
    [dywang@dyw219 make1]$ make -p -f makefile3 | sed '/^#/d' | sed '/^$/d' | grep -A1 "mylib.a" --color
    MYLIB = mylib.a
    COMPILE.C = $(COMPILE.cc)
    --
    mylib.a: mylib.a(2.o) mylib.a(3.o)
    3.c:
    mylib.a(3.o): 3.o
    	$(AR) $(ARFLAGS) $@ $<
    --
    main: main.o mylib.a
    	$(CC) -o $@ $(OBJS)
    --
    mylib.a(2.o): 2.o
    	$(AR) $(ARFLAGS) $@ $<
    
  4. 若 mylib.a 存在就先刪除,再以 makefile3 執行 make,可以驗證上述法則確實執行。
    [dywang@dyw219 make1]$ rm mylib.a 
    [dywang@dyw219 make1]$ make -f makefile3
    ar rv mylib.a 2.o
    ar: creating mylib.a
    a - 2.o
    ar rv mylib.a 3.o
    a - 3.o
    gcc -o main main.o 2.o 3.o
    
  5. 刪除 3.o,再執行一次 make,與 3.o 相關的程式都必須重新產生,包含 mylib.a。
    [dywang@dyw219 make1]$ rm 3.o
    [dywang@dyw219 make1]$ make -f makefile3
    gcc -Wall -c 3.c
    ar rv mylib.a 3.o
    r - 3.o
    gcc -o main main.o 2.o 3.o