首先看一个例:
#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 的参数了。
入门第二天……有错误请指正……