【nmake】Nmake基本语法和Windows下的makefile.vc编写demo

小编 2026-06-15 阅读:1641 评论:0
DATE: 2018.12.21 1、参考: https://blog.csdn.net/bytxl/article/details/46315131 https://blog.csdn.n...

DATE: 2018.12.21


1、参考:

https://blog.csdn.net/bytxl/article/details/46315131
https://blog.csdn.net/mini92/article/details/77374577
https://www.cnblogs.com/kekec/archive/2013/04/21/3007277.html
https://blog.csdn.net/SoaringLee_fighting/article/details/85158835
https://cognitivewaves.wordpress.com/makefiles-windows/
https://cognitivewaves.wordpress.com/makefiles/

2、前言

    前面讲述过Windows下gnu makefile的编写以及对应编译方法(参考:GnuWin32使用以及windows下gnu makefile编写),本文讲述的是Windows下符合Nmake编译规则的VC makefile.vc的编写方法,由于nmake和gmake两者存在不同,造成这两种makefile之间句法存在差异,主要是预处理宏、内置宏和变量使用方面的差异。

3、Nmake基本语法
3.1、Nmake简介

    Nmake同GNU make类似,属于make的变种,是一种用于自动化编译的工具,Nmake通过解析makefile来实现自动化编译,在makefile中定义了编译规则,并且通过推导规则实现选择性编译,节省编译时间。

MSDN的描述: Microsoft 程序维护实用工具 (NMAKE.EXE) 是一个 32 位,基于说明文件中包含的命令生成项目的工具。
语法:

NMAKE [options] [macros] [targets] [@commandfile]

说明:其中,options是NMAKE的选项,macros是在命令行中的宏定义,targets是NMAKE的目标文件列表,commandfile是包含命令行输入的文本文件(或响应文件)。

选项options:

/A Build all evaluated targets
/B Build if time stamps are equal
/C Suppress output messages
/D Display build information
/E Override env-var macros
/HELP Display brief usage message
/I Ignore exit codes from commands
/K Build unrelated targets on error
/N Display commands but do not execute
/NOLOGO Suppress copyright message
/P Display NMAKE information
/Q Check time stamps but do not build
/R Ignore predefined rules/macros
/S Suppress executed-commands display
/T Change time stamps but do not build
/U Dump inline files
/Y Disable batch-mode 
/? Display brief usage message
3.2、Nmake基本语法

    当用户输入nmake命令后,首先nmake会读取makefile,然后解析makefile,并根据makefile的规则来确定要编译哪些代码。然后nmake会调用编译器、链接器等一些开发工具,完成对代码的编译链接。最终会生成可执行文件。

(1)描述块(推导规则)

targets... : dependents...
	commands...

nmake的描述块的规则和用法同gmake的推导规则,targets也就是一个目标文件,可以是Object File,也可以是可执行文件。还可以是一个标签(Label)。targets必须在一行的顶格写,前面不能有空格。
dependents就是要生成target所需要的文件或是目标依赖项。dependents与targets之间用冒号间隔。一个targets可以有多个dependents。
command也就是NMake需要执行的命令。其中commands可以是任意的Windows命令行命令。
这是一个文件的依赖关系,也就是说,target这一个或多个的目标文件依赖于dependents中的文件,其生成规则定义在command中。也就是说,dependents中如果有一个以上的文件比targets文件要新的话,command所定义的命令就会被执行。这就是makefile的规则。也就是Makefile中最核心的内容。

(2)使用变量

CC=cl.exe
LINK=link.exe
LIB=lib.exe

注意:

  1. 在nmake格式的makefile中$(CC)和$(CPP)属于内置宏,默认值为cl。
  2. 不支持gnu make中的立即赋值:=,追加赋值+=和条件赋值?=的变量赋值方式。
  3. nmake中的自动变量使用不同于gnu make。

(3)使用预处理
预处理指令以“!”开头,必须出现在每行的最开始。最常用的预处理指令是条件处理。
条件处理:
Nmake支持如下的条件预处理指令:

!IF 

!IFDEF

!IFNDEF

!ELSE

!ELSEIF

!ELSEIFDEF

!ELSEIFNDEF

!ENDIF

文件包含:

! INCLUDE [<] 文件名 [>]

显示错误信息:

!MESSAGE <内容> 
!ERROR message 

参考网址:http://www.cnblogs.com/end/articles/698432.html
更多知识可参考MSDN:https://docs.microsoft.com/en-us/cpp/build/nmake-reference?view=vs-2017

4、Windows下VC makefile.vc编写demo

简单demo:

#宏定义
EXE = test.exe   #指定输出文件名
OBJS = main.obj  #需要的目标文件
RES =                   #需要的资源文件

LINK_FLAG = /DEBUG /subsystem:console  #连接选项;启用DEBUG模式;使用控制台。
CL_FLAG = /EHsc /c /Zi /Tp                           #编译选项,选了部分必要的CL选项

#显式规则
$(EXE): $(OBJS) $(RES)
  link $(LINK_FLAG) $(OBJS) $(RES) $(LIBS) /OUT:$(EXE)

#隐含规则
.cpp.obj:
  cl $(CL_FLAG) $<

.rc.res:
  rc $<

#清临时文件
clean:
  del *.obj
  del *.exe
  # del *.res

Linux makefile与Windows VC makefile的部分区别:
\"在这里插入图片描述\"


THE END!

版权声明

本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。

上一篇:开启curl 下一篇:常用函数
热门文章
  • 机房智能化温湿度解决方式之POE供电以太网温湿度传感器

    机房智能化温湿度解决方式之POE供电以太网温湿度传感器
    机房智能化温湿度解决方式之POE供电以太网温湿度传感器 北京盈创力和电子科技有限公司 智能型TCP网口温湿度记录仪 北京IP网络温湿度记录仪厂家,北京盈创力和 北京智能型TCP网口温湿度记录仪IP网络温湿度记录仪是一种新型的基于TCP/IP协议双绞线以太网标准温湿度采集模块,利用它可以实现现场温度值、相对湿度值的采集,同时利用其自身的RJ45通信接口可以方便地和机房监控主机或交换机集线器进行联网。 工作于-40℃~85℃工业级带...
  • Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering

    Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering
    Problem Statement 我们考虑一个具有马尔可夫性质、非线性、非高斯的状态空间模型(State Space Model):对于一个时间序列上的观测结果{yt,t∈N}\\{ y_t , t \\in N \\}{yt​,t∈N},我们认为每个观测结果yty_tyt​的生成依赖于一个无法直接观察的隐变量xt∈{xt,t∈N}x_t \\in \\{x_t , t \\in N \\}xt​∈{xt​,t∈N},即:p(...
  • HTTP状态保持的原理

    HTTP状态保持的原理
    a)在用户登录之后,浏览器返回响应的时候会在响应中添加上cookieb)浏览器接收到cookie之后会自动保存c)当用户再次请求同一服务器中的其他网页的时候,浏览器会自动带上之前保存的cookied)服务接收到请求之后可以请 request 对象中取到cookie 判断当前用户是否登录  Http是无状态的,就是连接时数据互通,关闭后...
  • Hive 系统函数及示例

    Hive 系统函数及示例
    查看所有系统函数 show functions; 函数分类 内置函数【系统函数】 数学函数: floor、round、ceil、cos、log2等 字符串函数: length、reverse、trim、lower、get_json_object、repeat等 收集函数: size 转换函数: cast 日期函数: year、month、datediff、date、date_add等 条件函数: coalesce、case…w...
  • CSRF的原理和防范措施

    CSRF的原理和防范措施
    a)攻击原理:i.用户C访问正常网站A时进行登录,浏览器保存A的cookieii.用户C再访问攻击网站B,网站B上有某个隐藏的链接或者图片标签会自动请求网站A的URL地址,例如表单提交,传指定的参数iii.而攻击网站B在访问网站A的时候,浏览器会自动带上网站A的cookieiv.所以网站A在接收到请求之后可判断当前用户是登录状态,所以...
标签列表