makefile简单用例

本文深入解析Makefile文件的使用方法,包括基本概念、自动推导、变量使用、应用实例以及伪目标文件的配置,帮助开发者高效管理构建过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

注:在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)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值