1. 程式人生 > >makefile 編寫規則

makefile 編寫規則

可執行 缺點 容易 編譯鏈接 清晰 bool div class 區別

一、makefile 規則

  1、如果沒編譯過,將所有的 (.c) 文件編譯並且鏈接;

  2、如果有其中的 (.c) 文件改變,編譯並鏈接改變的文件;

  3、如果(.h)文件被修改,編譯引用相應的 (.c) 文件, 鏈接;

  4、在隨意修改時間的情況下,會導致編譯過程中生成的 (.o 中間文件)與可執行文件時間不一致,此時會編譯相應的文件,並鏈接,最終編譯成可執行文件;

二、第一版 makefile:

  例如有2個 .h 文件(utils.h, player.h, actor.h)和 3個 .c 文件( main.c, player.c, actor.c)需要編譯鏈接:

/*****main.c*********/
#include "utils.h"
#include "player.h"

void main() {
 // do something
}
/*******player.c**********/

#include "utils.h"
#include "actor.h"

bool create_player() {
// do something
}
/****actor.c************/

#include "utils.h"

bool create_actor() {
// do something
}
/*********  makefile   *****************/    
    test : main.o actor.o
        cc -o test main.o actor.o

    main.o : main.c utils.h player.h actor.h
        cc -c main.c

    palyer.o: player.c player.h actor.h utils.h
        cc -o player.c

    actor.o: actor.h utils.h
        cc 
-o actor.c clean: rm test ain.o player.o actor.o

  優點:可毒性很強,思路清晰 明了;

  缺點:麻煩,重復的依賴過多,當需要編譯大量文件時容易出錯;

第二版:利用 makefile 的變量;

/*********  makefile   *****************/    
    obj = main.o actor.o    // 跟第一版比較,唯一的區別在這

    test : $(obj)        // 這兒
        cc -o $(obj)      // 這兒

    main.o : main.c utils.h player.h actor.h
        cc -c main.c

    palyer.o: player.c player.h actor.h utils.h
        cc -o player.c

    actor.o: actor.h utils.h
        cc -o actor.c

    clean:
        rm test ain.o player.o actor.o

makefile 編寫規則