跟我學Makefile(一)

  1.首先,把源文件編譯生成中間代碼文件,Windows下.obj文件,unix下.o文件,即Object File。這個動做叫編譯(compile)函數

  把大量的Object File合併執行文件,叫作連接(link)ui

  2.在編譯時,編譯器只檢測程序語法、函數、變量是否被申明。若是函數爲被申明,編譯器會給出一個警告,但能夠生成object File。spa

  而在連接程序時,鏈接器會在全部的object File中尋找函數的實現,若是找不到,就會報連接錯誤碼(link ERROR)命令行

 

Makefile的規則:unix

  target:prerequisite    //target:目標文件,prerequisite :就是要生成那個target所需的文件或是目標調試

    command            //command也就是make所需執行的命令。注意:這一行必定是一個Tap鍵做爲開頭。code

例:blog

  edit : main.o kbd.o command.o display.o \
     insert.o search.o files.o utils.o
      cc -o edit main.o kbd.o command.o display.o \
        insert.o search.o files.o utils.o
  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 main.o kbd.o command.o display.o \
        insert.o search.o files.o utils.oget

 

3.  .PHONY:clean        //表示「.PHONY」表示,clean是個僞目標文件編譯器

  clean:                      //clean不是一個文件,只是一個動做名字,像C語言中的lable同樣,其冒號後什麼都沒有,make不會自動去找文件的依賴性,要執行其後面的命令,就要在make命令後明顯得指出這個lable的名字。即:「make clean」

      rm edit $(objects)

4.每一個Makefile中都應該寫一個清空目標文件(.o和執行文件)的規則,這不只便於重編譯,也很利於保持文件的清潔。這是一個「修養」

  通常的風格都是:
      clean:
        rm edit $(objects)
  更爲穩健的作法是:
      .PHONY : clean
      clean :
        -rm edit $(objects)  //。而在rm命令前面加了一個小減號的意思就是,也許某些文件出現問題,但不要管,繼續作後面的事

  不成文的規矩是——「clean歷來都是放在文件的最後」。

5.Makefile中只有行註釋,其註釋是用「#」字符,若是你再Makefile中使用「#」字符,可使用反斜框進行轉義,如「\#」

 

make的工做方式

GNU的make工做時執行步驟以下:

1.讀入全部的makefile。
2.讀入被include的其它makefile。
3.初始化文件中的變量。
4.推導隱晦規則,並分析全部規則。
5.爲全部的目標文件建立依賴關係鏈。
6.根據依賴關係,決定哪些目標要從新生成。
7.執行生成命令。

 1-5 步爲第一個階段, 6-7 爲第二個階段。第一個階段中,若是定義的變量被使用了,那麼,make 會把其展開在使用的位置。但 make 並不會徹底立刻展開, make 使用的是拖延戰術,若是變量出如今依賴關係的規則中,那麼僅當這條依賴被決定要使用了,變量纔會在其內部展開。

 

規則說明:

targets : prerequisites
    command
    ...
或是這樣:
targets : prerequisites ; command
    command
    ...

command 是命令行,若是其不與「target:prerequisites」在一行,那麼,必須以[Tab]開頭,若是和 prerequisites 在一行,那麼能夠用分號作爲分隔。

 

若是你的 Makefile 須要一口氣生成若干個可執行文件,但你只想簡單地敲一個 make 完事,而且,全部的目標文件都寫在一個 Makefile 中,那麼你可使用「僞目標」這個特性:

all : prog1 prog2 prog3
.PHONY : all

prog1 : prog1.o utils.o
    cc -o prog1 prog1.o utils.o

prog2 : prog2.o
    cc -o prog2 prog2.o

prog3 : prog3.o sort.o utils.o
    cc -o prog3 prog3.o sort.o utils.o

 

 編譯器支持「-M」選項,表示自動找尋文件中包含的頭文件。

如:gcc -M main.c

 

make執行時,帶入make參數「-n」或「--just-print」,那麼其只是顯示命令,但不會執行命令,這個功能頗有利於咱們調試makefile。看看咱們書寫的命令執行順序。

make參數「-s」或「--slient」,則全面禁止命令的顯示。。。

 

須要注意的是,若是你要讓上一條命令的結果應用在下一條命令時,你應該使用分號分隔這兩條命令。 好比你的第一條命令是 cd 命令,你但願第二條命令得在 cd 以後的基礎
上運行,那麼你就不能把這兩條命令寫在兩行上。

示例一:
exec:
    cd /home/hchen
    pwd
示例二:
exec:
    cd /home/hchen; pwd

當咱們執行「make exec」時,第一個例子中的 cd 沒有做用,pwd 會打印出當前的 Makefile目錄,而第二個例子中, cd 就起做用了, pwd 會打印出「/home/hchen」。

相關文章
相關標籤/搜索