Makefile 相依性項目

  1. 再查看 main.c 2.c 3.c 程式包含的標頭檔。
    [dywang@dyw219 make1]$ grep ^# main.c 
    #include <stdlib.h>
    #include "a.h"
    [dywang@dyw219 make1]$ grep ^# 2.c 
    #include <stdio.h>
    #include "a.h"
    #include "b.h"
    [dywang@dyw219 make1]$ grep ^# 3.c 
    #include "b.h"
    #include "c.h"
    
  2. 以查到的標頭檔確認:目標項目 2.o 與 2.c a.h b.h 三個檔有關,main 與 main.o、2.o、3.o 相關,main.o 與 main.c、a.h 相關,以此類推。
    main.o: main.c a.h
    2.o: 2.c a.h b.h
    3.o: 3.c b.h c.h
    
  3. 其實可以不用這麼麻煩,以 gcc 的 -MM 選項查詢 main.c 2.c 3.c,就可以 makefile 格式輸出相依性項目。
    [dywang@dyw219 make1]$ gcc -MM main.c 2.c 3.c
    main.o: main.c a.h
    2.o: 2.c a.h b.h
    3.o: 3.c b.h c.h
    
  4. 輸出結果可插入 makefile 中,成為相依性的法則。
    [dywang@dyw219 make1]$ gcc -MM main.c 2.c 3.c >> makefile
    
  5. 查看 makefile 除原先的 main 目標項目外,增加了 main.o 2.o 3.o 三個目標項目,但都沒有指定編譯法則。
    [dywang@dyw219 make1]$ cat makefile
    main: main.o 2.o 3.o
    main.o: main.c a.h
    2.o: 2.c a.h b.h
    3.o: 3.c b.h c.h
    
  6. 執行 make 自動找到 makefile 編譯,沒有指定編譯法則,則使用 make 內建法則。
    [dywang@dyw219 make1]$ make
    cc    -c -o main.o main.c
    cc    -c -o 2.o 2.c
    cc    -c -o 3.o 3.c
    cc   main.o 2.o 3.o   -o main
    
  7. 成功產生 main 執行檔,並執行成功。
    [dywang@dyw219 make1]$ ./main 
    2222