1. 程式人生 > >GNU的make命令、makefile編寫

GNU的make命令、makefile編寫

makefile簡介


  • makefile可實現工程的自動化編譯,只需一個make命令即可一鍵完成。makefile定義了一些規則,指定哪些檔案需要先編譯、後編譯、重新編譯等。

  • 一般的C或者C++程式,都需要先編譯成中間檔案,windows下為.obj檔案,UNIX下為.o檔案,這個過程稱為編譯(compile)。

  • 每個原檔案都應該對應一箇中間檔案(.obj檔案或者.o檔案),把大量的中間檔案合成執行檔案的過程,稱為連結(Link);連結時,主要是連結函式和變數,即可以使用.obj檔案或者.o檔案連結應用程式。連結器只關係函式的中間檔案,不關心原始檔的位置,為了避免大量的中間檔案的複雜管理,需給中間檔案打包,windows下稱為庫檔案(Library File),即.lib檔案,UNIX下為Archive File,即 .a檔案。

makefile規則


流程

目標 : 需要的條件(注意 : 兩邊的空格)
    命令(以Tab鍵開頭)

解釋一下:

  • 目標 可以是一個或者多個,可以是ObjectFile檔案、執行檔案、甚至標籤
  • 條件 指的是 依賴的檔案或者目標
  • 命令 指的是 生成目標需要執行的指令碼

總結:即一條makefile規則定義了編譯的依賴關係,目標檔案依賴於條件,生成規則用命令

舉個例子

objects = main.o kbd.o command.o display.o /
              insert.o search.o files.o utils.o
    edit : $(objects)
            cc -o edit $(objects)
    main.o : main.c defs.h
            cc -c main.c
    kbd.o : kbd.c defs.h command.h
            cc -c kbd.c
    command.o : command.c defs.h command.h
            cc -c command.c
    display.o : display.c defs.h buffer.h
            cc -c display.c
    insert.o : insert.c defs.h buffer.h
            cc -c insert.c
    search.o : search.c defs.h buffer.h
            cc -c search.c
    files.o : files.c defs.h buffer.h command.h
            cc -c files.c
    utils.o : utils.c defs.h
            cc -c utils.c
    clean :
            rm edit $(objects)

make命令


  1. 首先在當前目錄下尋找"makefile"或者"Makefile"檔案找到,則定位到第一個目標檔案(target),上例中,會找到"edit"檔案,並把此檔案作為最終目標檔案
  2. 若eidt檔案不存在,或者eidt後依賴的.o檔案的修改時間比edit檔案新,則執行後面定義的命令生成edit檔案
  3. 若edit後依賴的.o檔案也不存在,make會在當前檔案中尋找.o檔案的依賴性,若找到,則根據那個規則生成.o檔案.c和.h檔案存在,make生成.o檔案,最後執行edit

自動推導

GNU的make命令支援自動推導,只要make看到一個.o檔案,就會自動把.c檔案加到依賴關係中,則上述例子可簡化為以下形式

objects = main.o kbd.o command.o display.o /
              insert.o search.o files.o utils.o
    edit : $(objects)
            cc -o edit $(objects)

    main.o : defs.h
    kbd.o : defs.h command.h
    command.o : defs.h command.h
    display.o : defs.h buffer.h
    insert.o : defs.h buffer.h
    search.o : defs.h buffer.h
    files.o : defs.h buffer.h command.h
    utils.o : defs.h
  clean :
            rm edit $(objects)

檔案功能

make支援多檔案共簡規則,上述例子可進一步簡化為如下形式(但不推薦,因為較難維護)

objects = main.o kbd.o command.o display.o /
              insert.o search.o files.o utils.o
    edit : $(objects)
            cc -o edit $(objects)

    $(objects) : defs.h
    kbd.o command.o files.o : command.h
    display.o insert.o search.o files.o : buffer.h
    clean :
            rm edit $(objects)

清空目標檔案規則

每一個makefile檔案都應該清楚的寫一個清空目標的(.o和執行檔案)規則,有利於重編譯和檔案的清結性。

.PHONY表示clean是一個"偽目標",rm前的減號表示,某些檔案出問題但是不要管,繼續往下走。

clean預設放在檔案尾,不然會被當作預設目標。

 `一般的風格為:`
clean:
            rm edit $(objects)
`較為穩健的方法:`
.PHONY : clean
        clean :
                -rm edit $(objects)

make編譯安裝

流程

  • 首先下載.tar.gz或者.tar.bz2軟體包檔案

  • 使用tar命令解壓

  • 進入到解壓後文件目錄(因為make是搜尋當前檔案位置)

  • 使用./configure -prefix={Your Install Path} (其他configure引數自行百度)

  • make編譯(或者使用make all,過程有時很慢,有時會報錯,可能是依賴包的問題,解決依賴關係即可)

  • make install 安裝(需足夠許可權,部分軟體需要make check 或者 make test 進行測試)

  • make clean 清除編譯產生的中間檔案(Objectfile或者.o檔案)

舉個例子

//1.解壓縮
tar -zxf xxxxx-4.0.2.tar.gz  
//2.進入目錄
cd xxxxx-4.0.2
//3.配置
./configure --prefix=/usr/local/xxxxx     
//4.編譯
make all
//5.安裝
make install && make install-init && make install-commandmode && make install-config
//6.清除中間檔案
make clean

相關連結

  • http://blog.csdn.net/haoel/article/details/2887
  • http://www.cnblogs.com/xwdreamer/p/3623454.html
  • http://www.linuxidc.com/Linux/2011-02/32211.htm