天天看點

linux中Makefile的編寫

什麼是Makefile:

  ⼀個⼯程中的源⽂件不計數,其按類型、功能、子產品分别放在若⼲個⽬錄中,makefile定義了⼀系列的規則來指定,哪些⽂件需要先編譯,哪些⽂件需要後編譯,哪些⽂件需要重新編譯,甚⾄于進⾏更複雜的功能操作,因為makefile就像⼀個Shell腳本⼀樣,其中也可以執⾏作業系統的指令。

Makefile的作用:

  makefile的作用就是——“⾃動化編譯”,即把工程中的各類源檔案按照開發者在Makefile裡定義的一系列規則來編譯,,⼀旦寫好,隻需要⼀個make指令,整個⼯程完全⾃動編譯,極⼤的提⾼了軟體開發的效率。

Makefile的編譯規則

  假設我們的工程中定義有多個頭檔案和多個C檔案

1.如果這個⼯程沒有編譯過,那麼我們的所有C⽂件都要編譯并被連結。

2.如果這個⼯程的某⼏個C⽂件被修改,那麼我們隻編譯被修改的C⽂件,并連結⽬标程式。

3.如果這個⼯程的頭⽂件被改變了,那麼我們需要編譯引⽤了這⼏個頭⽂件的C⽂件,并連結⽬标程式。

Makefile的書寫格式為:

 target : prerequisites

    command

其中:

target:一個目标檔案,可以是Object File,也可以是執行檔案。還可以是一個标簽

prerequisites:要生成那個target所需要的檔案或是目标

command:是make需要執行的指令。(任意的Shell指令)

Makefile的簡單編寫

首先建立一個Makefile檔案和test.c檔案

linux中Makefile的編寫

按照編寫規則在Makefile裡完成編寫,如下圖

linux中Makefile的編寫

在test.c檔案裡也完成一個簡單的函數編寫

linux中Makefile的編寫

  

  make的工作過程

1 make會在目前⽬錄下找名字叫“Makefile”或“makefile”的⽂件。

2 如果找到,它會找⽂件中的第⼀個⽬标⽂件(target),在上⾯的

例⼦中,他會找到“edit”這個⽂件,并把這個⽂件作為最終的⽬标⽂

件。

3 如果edit⽂件不存在,或是edit所依賴的後⾯的 .o ⽂件的⽂件修改

時間要⽐edit這個⽂件新,那麼,他就會執⾏後⾯所定義的指令來⽣

成edit這個⽂件。

4 如果edit所依賴的.o⽂件也存在,那麼make會在目前⽂件中找⽬标

為.o⽂件的依賴性,如果找到則再根據那⼀個規則⽣成.o⽂件。(這

有點像⼀個堆棧的過程)

5 當然,你的C⽂件和H⽂件是存在的啦,于是make會⽣成 .o ⽂件,

然後再⽤ .o ⽂件聲明make的終極任務,也就是執⾏⽂件edit了。

  此時輸入make指令,生成執行檔案edit。輸入 ls顯示檔案目錄,可發現多了test檔案和test.o檔案。再輸入 ./test 執行可執行檔案test。如下圖

linux中Makefile的編寫

輸入 make clean,可清除所有的目标檔案,以便重新編譯。每個Makefile中都應該寫一個清空目标檔案(.o和執行檔案)的規則,這不僅便于重編譯,也很利于保持檔案的清潔。

linux中Makefile的編寫

在清空目标檔案時需要注意的問題是僞目标.PHONY

.PHONY : clean
   clean :
           -rm edit $(objects)
           

.PHONY 意思表⽰clean是⼀個“僞⽬标”。⽽在rm指令前⾯加了⼀個⼩減号的意思就是,也許某些⽂件出現問題,但不要管,繼續做後⾯的事。當然,clean的規則不要放在⽂件的開頭,不然,這就會變成make的預設⽬标。不成⽂的規矩是——“clean從來都是放在⽂件的最後”。

僞目标可以是沒有依賴檔案的目标檔案,例如clean就可以定義為僞目标,防止誤觸發。或者在一個Makefile裡面你想一次make生成多個可執行檔案,也可以利用僞目标的定義。

繼續閱讀