注:在makefile文件中,"#"后的内容是注释。
========================================================
1、最简单的例子
# 目标文件名 : 此目标文件依赖的文件
#
--------------------------------------------------------
# 在这个例子里,其命令序列是将 obj 文件链接成可执行文件
A.exe: A.obj
link /subsystem:windows A.obj
# 在这个例子里,其命令序列是将 asm 文件编译成 obj 文件
A.obj: A.asm
ml /c /coff A.asm
========================================================
2、自动推导
nmake.exe可以自动推导文件以及文件依赖关系后面的命令,于是我们就没必要去在每一个目标文件[.obj]后都写上类似的命令,因为,我们的nmake会自动识别,并自己推导命令。
只要nmake看到一个[.obj]文件,它就会自动的把[.cpp]文件加在依赖关系中,如果nmake找到一个whatever.obj,那么whatever.cpp,就会是whatever.obj的依赖文件。
========================================================
3、使用变量
# 在
Makefile 里变量用 $() 引用
#变量定义
EXE = Test.exe
OBJS = a.obj b.obj #需要的目标文件
RES = Test.res
LINK_FLAG = /subsystem:windows #连接选项
ML_FLAG = /c /coff
#显示规则
$(EXE): $(OBJS) $(RES)
Link $(LINK_FLAG) $(OBJS) $(RES)
#隐含规则
.asm.obj:
ml $(ML_FLAG) $<
.rc.res:
rc $<
#清临时文件
clean:
del *.obj
del *.res
-------------------------------------------------
【注】
隐含规则中所用到的几个特殊内定宏的定义如下:
$@
$*
$?
$<
所以rc $<就是rc *.rc
========================================================
4、应用实例
INCLUDE_DIR
= .\include #头文件目录
SRC_DIR = .\src #源文件目录
OBJ_DIR_X86
= .\obj_x86 #生成目标文件目录
BIN_DIR_X86 = .\bin_x86 #生成可执行文件目录
EXE_NAME = main.exe #可执行文件名称
#依赖的目标文件
OBJ_FILES = \
$(OBJ_DIR_X86)\printer.obj \
$(OBJ_DIR_X86)\main.obj
#编译
{$(SRC_DIR)}.cpp{$(OBJ_DIR_X86)}.obj::
@echo Compiling...
cl /MT /c /EHsc /Fo$(OBJ_DIR_X86)\ /I$(INCLUDE_DIR) $<
#链接
$(EXE_NAME): $(OBJ_DIR_X86)\*.obj
link /subsystem:console /out:$(BIN_DIR_X86)\$(EXE_NAME) $(OBJ_FILES)
#告诉 nmake.exe “clean”“create_dirs ”“all”都是伪目标文件, 避免和文件名冲突
.PHONY : clean create_dirs all
#all为执行所有操作的入口标签,比如VS命令工具转到当前目录下,运行“nmake all”命令
all: clean create_dirs $(EXE_NAME)
#如果临时目录存在则删除
clean:
@echo "remove folders"
@if exist $(BIN_DIR_X86) rmdir /S /Q $(BIN_DIR_X86)
@if exist $(OBJ_DIR_X86) rmdir /S /Q $(OBJ_DIR_X86)
#如果临时目录不存在则创建
create_dirs:
@echo "create folders"
@if not exist $(BIN_DIR_X86) mkdir $(BIN_DIR_X86)
@if not exist $(OBJ_DIR_X86) mkdir $(OBJ_DIR_X86)