一、makefile文件示例
makefile文件並不難寫,一個makefile模版如下所示,所有makefile文件在此基上稍微修改就可以了。
# this is a makefile #這一行是注釋 NAME = MemInfo.exe #下來這幾行是宏定義,相當於linux的變量 OBJS = $(NAME).obj RES = $(NAME).res LINK_FLAG = /subsystem:windows ML_FLAG = /c /coff $(NAME): $(OBJS) $(RES) #這一行指出最終生成的exe文件依賴哪些obj和res文件 Link $(LINK_FLAG) $(OBJS) $(RES) #這一行是生成exe時執行的鏈接命令; .asm.obj: #這一行表示.asm文件轉成.obj文件要使用下邊這個語句 ml $(ML_FLAG) $< #這一行是使用.asm轉.obj的編譯命令;$<表示對當前目錄下所有.asm文件進行編譯且編譯生成的.obj文件使用和原來.asm文件一樣的名字 .rc.res: #這一行表示.rc文件轉成.res文件要使用下邊這個語句 rc $< #這一行是使用.rc轉.res的編譯命令;$<表示對當前目錄下所有.rc文件進行編譯且編譯生成的.res文件使用和原來.rc文件一樣的名字 clean: #這一行表示最后要執行以下的清除命令 del *.obj #刪除當前目錄下的所有.obj文件 del *.res #刪除當前目錄下的所有.res文件
二、makefile文件解讀
2.1 makefile文件的組成
我們手動編譯的過程是:通過rc編譯資源文件,通過ml編譯源文件,通過link連接程序。
makefile其實就是用於指導make程序完成這幾件事,makefile就是由obj/res轉exe的鏈接規則、asm轉obj的編譯規則、rc轉res的編譯規則和清除中間文件的規則等四種規則組成;不過為了方便還引入了注釋和宏定義,這並不難理解。
2.2 顯式規則和隱含規則
makefile文件規則分為顯式規則和隱含規則兩種。
顯示規則指的是明確指出了生成的文件叫什么、由哪幾個文件生成的規則。比如上邊obj/res轉exe的鏈接規則是顯式規則:其明確指出生成文件叫MemInfo.exe,且是由MemInfo.obj和MemInfo.res兩個文件生成。
隱含規則指的是不具體指出具體文件名只指出文件擴展名的規則。比如asm轉obj的編譯規則中只是通過.asm.obj指出將asm文件轉成obj文件,並沒有具體指出哪個asm文件轉成obj文件。同理rc轉res的編譯規則和清除中間文件的規則也都是隱式規則。
但是要注意不是說可以簡單地歸類為:obj/res轉exe的鏈接規則是顯式文件,而asm轉obj的編譯規則等其他三種規則是隱式文件。當exe由obj和res兩種文件組成時其必然得是顯式規則,但如果只由obj文件組成那就可以寫成隱式規則;而asm轉obj的編譯等其他三種規則只要不嫌麻煩也完全可以寫成一條條的顯式規則。
或者叫,顯式規則適用於從某幾個文件到某個文件,隱式規則適用於從一類文件到另一類文件。