首先看一個例:
#for build & debug XRDP program
#2005 08 04
#create by ZAP @kouton
#out file ./debug/xrdp.exe
CP = copy # xcopy /r /i
MAKE = nmake
DEL = del /q/f
EXE = xrdp.exe
CPP = cl.exe
LINK32 = link.exe
LINK32_FLAGS=/nologo /subsystem:console /incremental:no /out:"$(EXE)"
#CPP_PROJ = -nologo -GR -GX -Zi -Zp1 -MD -DDEBUG -DWIN32 -D_CONSOLE # /Fr
CPP_PROJ=/nologo /EHsc /MDd /W3 /G5 /Zi /Od -D_DEBUG -DWIN32 -DWIN32_LEAN_AND_MEAN -D_CONSOLE -D_MBCS $(INCLUDE_DIRS) /FD /c
HEADERS = rdp.h /
constant.h
OBJS = xrdp.obj /
rdp.obj
$(EXE) : $(OBJS)
$(LINK32) $(LINK32_FLAGS) $(OBJS)
clean ::
-@$(DEL) $(EXE) $(OBJS) *.idb *.pdb
.cpp.obj::
$(CPP) @<<
$(CPP_PROJ) $<
<<
例子中第一部分 # 開頭的就是代表這一行是註釋,就像“//”
第二、三、四部分定義了一些宏,就像basic中不用生命變量而可以直接給一個變量賦值一樣,這些宏最終都會以字符串的形式在後面的程序中被處理。
第四部分第一行,末尾 /out:"$(EXE)" $(EXE) 會把第三部分的 EXE 宏的內容讀出 最後就變成:/out"xrdp.exe"
第五部分定義了我們的所用到的頭文件,
第六部分是編譯產生的obj文件名字(obj根據相應的.cpp .c產生)
第七部分說明一個依賴關係 也就是說 xrdp.exe依賴於 : 後面的 .obj產生 如果obj文件有更新的版本(時間),那麼就要重新生成一次 exe。 $(LINK32) $(LINK32_FLAGS) $(OBJS) 則說明了生成的方法.(展開就知道是用前面的link.exe 連接的
用nmake clean 可以刪除編譯期間產生的臨時文件……
最後
.cpp.obj::
$(CPP) @<<
$(CPP_PROJ) $<
<<
這個說明了所有cpp文件的生成方法, 而兩個"<<" 之間的東西會被導入一個臨時文件中,在命令行特別長的情況下 可以用這種方法來做
同樣
$(EXE) : $(OBJS)
$(LINK32) $(LINK32_FLAGS) $(OBJS)
也可以變成
$(EXE) : $(OBJS)
$(LINK32) @<<
$(LINK32_FLAGS) $(OBJS) $<
<<
makefile 有很多寫法,不知道這種會不會造成重複編譯……
不過這樣有一定的通用性,又要開始學 cl 的參數了。
入門第二天……有錯誤請指正……