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」。