Nmake使用方法

nmake编译dll 想弄nmake,百度上基础资料太少,都是linux的makefile,弄了2天才一点点效果 头痛中。。。 以下记录 //main.cpp #include using namespace std; //把Test.h改名为TestLib.h,并去掉_declspec(dllexport)  #include "TestLib.h" #pragma comment(li 阅读详情
简介

大家已经习惯于微软提供的功能强大的IDE,已经很少考虑手动编连项目了,所谓技多不压身,有空的时候还是随我一块了解一下命令行编译。

C/C++/VC++程序员或有Unix/Linux编程经验应该很熟悉,以前我曾写过一篇文章描述用csc/vbc来进行命令行编译,今天再介绍一下MS提供的更加快捷有效的编译工具NMake。

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

NMake具有丰富的选项,可以完成复杂编译操作。它可以辨别源代码的改动,并选择性的编译,为你节省大量不必要的编译时间。

使用NMAKE

语法:NMAKE [options] [macros] [targets] [@commandfile]

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

NMAKE 使用指定 /F 选项的Makefile(生成文件,通常名字是makefile);如果未指定 /F 选项,则使用当前目录下的Makefile。如果未指定Makefile,则 NMAKE 使用推理规则生成命令行 targets。

NMake本身很简单,与NMAKE配合的是Makefile。Makefile的语法比较复杂,通常需要开发者自己手动编写Makefile,下一节我们详细讲解Makefile。

上面的options和macros做了MSDN的链接,内容较多,请自己查询相关页,可以从这里进入NMake的MSDN帮助页面,在线帮助点这里。

编写MAKEFILE

注:本节内容来自MSDN,熟悉此节的朋友可以直接跳过

Makefile的组成部分包括:成文件包含:

  • 描述块 (description block)
  • 命令
  • 宏
  • 推理规则 (inference rules)
  • 点指令
  • 预处理指令


a.描述块

描述块是后面可跟有命令块的依赖项行:

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

依赖项行指定一或多个目标以及零或多个依赖项。目标必须位于行首。用冒号 (:) 将目标和依赖项分开;允许使用空格或制表符。若要拆分行,请在目标或依赖项后面使用反斜杠 (\ )。如果目标不存在、目标的时间戳比依赖项早或者目标是伪目标,则 NMAKE 执行命令。如果某依赖项是其他地方的目标,并且不存在或对于自己的依赖项已过期,则 NMAKE 在更新当前依赖项之前更新该依赖项。

b.命令

如果依赖项已过期,则描述块或推理规则指定要运行的命令块。NMAKE 在运行命令之前显示每个命令,除非使用了 /S 选项、.SILENT、!CMDSWITCHES 或 @。如果描述块后面没有紧跟命令块,NMAKE 将查找匹配的推理规则。

命令块包含一个或多个命令,每个命令位于各自的命令行上。在依赖项(或规则)和命令块之间不能出现空行。但是可以出现只包含空格或制表符的行;该行被解释为空命令,并且不出现错误。命令行之间允许有空行。

命令行以一个或多个空格或制表符开始。后面紧跟着换行符的反斜杠 ( \ ) 在命令中被解释为空格;在行尾使用反斜杠继续下一行命令。如果反斜杠后紧跟有其他任何字符(包括空格或制表符),则 NMAKE 按原义解释反斜杠。

无论后面是否紧跟有命令块,前面带分号 (;) 的命令可以出现在依赖项行上或推理规则中:

project.obj : project.c project.h ; cl /c project.c


c.宏

宏用另一个字符串替换生成文件中的特定字符串。使用宏可以:

  • 创建可生成不同项目的生成文件。
  • 指定命令选项。
  • 设置环境变量。

可以定义您自己的宏或使用 NMAKE 的预定义宏。


d.推理规则

推理规则提供命令来更新目标并推理目标的依赖项。推理规则中的扩展名与具有相同基名称的单个目标和依赖项匹配。推理规则是用户定义的,或预定义的;预定义的规则可以重新定义。

如果过期的依赖项没有命令,并且如果 .SUFFIXES 包含依赖项的扩展名,则 NMAKE 使用其扩展名与当前或指定目录中的目标和现有文件匹配的规则。如果有多个规则与现有文件匹配,.SUFFIXES 列表将确定使用哪一个规则;列表优先级从左向右按降序排列。如果依赖文件不存在,并且未在另一个描述块中作为目标列出,则推理规则可以从具有相同基名称的另一个文件创建缺少的依赖项。如果描述块的目标没有依赖项或命令,推理规则可以更新目标。即使不存在描述块,推理规则也可以生成命令行目标。即使指定了显式依赖项,NMAKE 也可以调用推理依赖项的规则。


e.点指令

在描述块之外的行首指定点指令。点指令以句点 ( . ) 开始,后面跟一个冒号 (:)。允许使用空格或制表符。点指令名区分大小写并且应为大写。

指令作用
.IGNORE :忽略从指定该指令的位置到生成文件末尾之间,由命令返回的非零退出代码。默认情况下,如果命令返回非零退出代码,NMAKE 将暂停。若要还原错误检查,请使用 !CMDSWITCHES。若要忽略单个命令的退出代码,请使用短划线 (-) 修饰符。若要忽略整个文件的退出代码,请使用 /I 选项。
.PRECIOUS : targets若更新 targets 的命令暂停,则将 targets 保留在磁盘上;若命令通过删除文件处理中断,则该指令无效。用一或多个空格或制表符分隔目标名称。默认情况下,如果通过使用 CTRL+C 或 CTRL+BREAK 组合键中断生成,NMAKE 将删除目标。.PRECIOUS 的每一次使用都应用于整个生成文件;多次指定是累计的。
.SILENT :取消从指定该指令的位置到生成文件末尾之间的已执行命令的显示。默认情况下,NMAKE 显示它调用的命令。若要还原回显,请使用 !CMDSWITCHES。若要取消单个命令的回显,请使用 @ 修饰符。若要取消整个文件的回显,请使用 /S 选项。
.SUFFIXES : list列出推理规则匹配的扩展名;预定义为:.exe .obj .asm .c .cpp .cxx .bas .cbl .for .pas .res .rc。

若要更改 .SUFFIXES 列表顺序或指定新列表,请清除此列表并指定新的设置。若要清除此列表,请不要在冒号后指定扩展名:

.SUFFIXES :

若要将其他后缀添加到列表的末尾,请指定

.SUFFIXES : suffixlist

其中 suffixlist 是附加后缀的列表,由一或多个空格或制表符分隔。若要查看 .SUFFIXES 的当前设置,请运行选项为 /P 的 NMAKE。


f.预处理指令

可以通过使用预处理指令和表达式控制 NMAKE 会话。预处理指令可以放置在生成文件或 Tools.ini 文件中。使用指令可以有条件地处理生成文件,显示错误信息,包括其他生成文件,取消定义宏以及打开或关闭某些选项。

Makefile示例

看了一堆理论,很累了吧?下面看一段简单的MakeFile

# 宏定义
                SOURCES=AssemblyInfo.cs \
                Form1.cs \
                Form2.cs \
                Form3.cs \
                HelloWorld.cs
                # 引用规则
                # 目标:
                CLRProfiler.exe : $(SOURCES) #<--依赖项
                # 标志
                # 下面是命令
                csc /t:winexe /out:HelloWorld.exe /r:System.Windows.Forms.dll $(SOURCES)
                clean:
                del HelloWorld.exe
 

将上述代码保存为Makefile(没有后缀)放在你的项目文件夹下, 然后打开VS2003.NET命令行窗口,进入项目夹所在路径,打入NMake回车, ok

示例2

下面演示一下多个项目时的编译,每个单独的项目创建单独的makefile,解决方案下放一个总的makefile

all:
                # 分别对项目进行编译
                cd project1
                nmake
                cd ..
                cd project2
                nmake
                cd ..
                cd project3
                nmake
                cd ..
                # 将编译结果汇总到当前路径
                copy project1\project1.dll
                copy project2\project2.dll
                copy project3\project3.exe
                clean:
                # 清除编译结果
                del project1.dll
                del project2.dll
                del project3.exe
                cd project1
                nmake clean
                cd ..
                cd project2
                nmake clean
                cd ..
                cd project3
                nmake clean
                cd ..
 
小节

本文简单介绍了NMAKE的用法,并对Makefile的语法做了介绍。篇幅所限,既不能面面俱到,又不能深入剖析,只希望能够让更多人了解此工具。笔者也是刚刚接触,经验不多,还请各位网友多多拍砖!

附表(makefile中常用的几个符号)

符合作用
^ (caret)用于关闭某些字符所具有的特殊意义,使其只表示字面上的意义。例如:^#abc表示#abc这个字符串,而#abc则用于在makefile中加入注释,#在这里为注释标志,就像C++中的//。另外,在一行的末尾加上^,可以使行尾的回车换行符成为字串的一部分。
# (number sign)注释标志,NMAKE会忽略所有从#开始到下一个换行符之间的所有文本。这里要注意的是:在command lines中不能存在注释。因为对于command lines,NMAKE是将其整行传递给OS的。通常对于command lines的注释都是放在行与行之间。
\ (backslash)用于将两行合并为一行。将其放在行尾,NMAKE就会将行尾的回车换行符解释为空格(space)。
% (percent symbol)表示其后的字符串为一文件名。
( (left parentheses) 
) (right parentheses) 
{ 
} 
! (exclamation symbol)命令修饰符
@ (at sign)命令修饰符
- (hyphen) 
: (colon)用于dependent lines和inference rules中,用于分隔target和dependent。
; (semicolon)如果对于一个dependent line只有一条命令,则可以将该命令放在dependent line的后面,二者之间用“;”分隔。
$ (dolor sign)用于调用宏



make、ninja、nmake、jom 、qmake、cmake 、GN 都是什么? CMake 可以生成各种不同的构建系统所需的文件,包括 Makefile、Ninja、Visual Studio 项目文件等,从而使得项目可以在不同的环境下构建和运行。QMake 专注于 Qt 项目的构建,CMake 则是一种通用的跨平台构建工具,而 GN 则是针对特定项目的高效构建工具。NMake是微软Microsoft提供的一个构建工具,它是Make的Windows版本 ,用于 Windows 环境下的项目构建。Make是一个经典的构建工具,它通过读取名为Makefile的文件来管理程序的编译过程。 阅读详情

相关推荐

NMake参考手册,介绍NMake编译

NMake参考手册,介绍NMake编译

nmake简介

Microsoft nmake的使用简介

harborian的博客 5678

从“盲控”到“预见”:聊聊永磁同步电机负载观测器(PMSM Load Observer)如何让控制更丝滑

本文深入探讨了永磁同步电机负载观测器(PMSM Load Observer)如何通过前馈补偿和转动惯量辨识技术实现智能抗扰控制。从传统‘盲控’到预见性调节,负载观测器显著减少转速波动和能耗,提升系统响应速度。文章详细解析了观测器算法架构、工程调参技巧及前沿发展趋势,为电机控制领域提供实用解决方案。

weixin_33737774的博客 406

msvc的nmake利用cpu多核心编译

同时编译多个 文件: 设置环境变量 set CL=/MP nmake

iMatt的专栏 5972

Mstar的Monitor方案OSD 菜单制作(五)——icon绘制

Mstar的Monitor方案(五)————绘制icon

android 系统定制开发那些事 1807

交换机四种光互联技术:OIO、OBO、NPO与CPO

在过去几十年里,数据中心交换机主要依赖电信号通过铜线进行数据传输。然而,随着数据传输速率从100Gbps向400Gbps、800Gbps甚至1.6Tbps迈进,传统电互联(Electrical Input & Output, EIO)面临三大瓶颈:信号衰减、功耗激增和空间限制。例如,高速信号在长距离铜线传输中会产生严重的信号失真,迫使设计者加入数字信号处理器(DSP)来补偿信号衰减,这进一步推高了功耗和成本。此外,传统可插拔光模块的体积较大,限制了端口密度,难以满足现代数据中心对高带宽密度的需求。

网络技术联盟站 3130

VC中使用nmake命令编译方法

VC6.0其实已经不再使用makefile文件进行编译了,但是它仍然可以导出makefile文件,后缀名为*.mak,方法是在工程菜单下的导出makefile文件,你也可以将*.mak文件更名为makefile这样就可以只使用nmake进行编译而不用再在后面带参数([/f makefile] )。        剩下的工作就是进入该工程文件所在的路径,然后执行makefile命令,然后再将生成文

believe的专栏 5751

【WorkBuddy专栏61】字节的AI打法为什么一直在变——WorkBuddy/CodeBuddy vs 字节Trae/TRAE Work/豆包全维度对比

【WorkBuddy专栏61】字节的AI打法为什么一直在变——WorkBuddy/CodeBuddy vs 字节Trae/TRAE Work/豆包全维度对比

AI人人懂 2748

nmake的调用方法

nmake的调用方法 一、安装VC++, 设置环境变量。         安装的过程不具体说明,现在主要说下如果设置环境变量:        点我的电脑属性->高级/环境变量->系统变量中双击Path,再在变量值最后加一分号,在把安装了VC++路径下的bin 的绝对路径加在最后面。 例如:   D:\Program Files\Microsoft Visual Studio\VC98\B

生命不息,奋斗不止 1327

高级电机控制场景实例:基于Simulink的永磁同步电机基于Luenberger观测器的弱磁控制仿真

本文基于Simulink实现表贴式永磁同步电机(SPMSM)的Luenberger观测器弱磁控制仿真,通过构建“观测-弱磁-控制”协同逻辑,突破传统矢量控制的基速限制。利用线性化模型设计观测器实时估计电流与磁链,结合电压极限约束动态注入负d轴电流,实现转速扩展至12000rpm(4倍基速),弱磁区电流THD低于3%,动态响应时间小于5ms,验证了高速运行下系统稳定性与鲁棒性。附完整建模步骤、MATLAB函数代码及性能分析,适用于电动汽车、机床等高速驱动场景,为高级电机控制提供可复现的技术范式。

amy_mhd的博客 32

【四足机器人项目实战】四足机器人运动学、动力学模型

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录系列文章目录前言一、四足机器人实际模型的物理难点二、四足机器人运动学模型1.方法一:DH法建立运动学模型(1)运动学建模构型方法(2)运动学模型描述方法1、基于DH法四足机器人单腿运动学模型公式推导(0)DH法科普1)原理2)实现过程3)评价(1)四足机器人的建模规则、坐标系定义及实物参数确定1)标准Denavit-Hartenberg法建模规则2)单腿运动学模型坐标系定义示意图及简化模型3)

qq_35635374的博客 1万+

一些关于NMAKE的使用方法

nmake功能:跳出IDE编译源程序 配置: 环境变量:  include:    C:/Program Files/Microsoft Visual Studio/VC98/atl/include;C:/Program Files/Microsoft Visual Studio/VC98/mfc/include;C:/Program Files/Microsoft Vis

viggin的专栏 1913

深入理解 ABAP 中的 Fast Data Access:从 @itab 到 FOR ALL ENTRIES 的性能关键路径

ABAP性能优化的关键在于理解Fast Data Access(FDA)机制,它连接了应用服务器的内表与数据库运算。FDA允许将内表数据推送到数据库进行筛选、聚合等操作,是SELECT...FROM@itab语法的基础。开发者需注意:1)该语法可能在内置引擎或数据库执行;2)仅当SQL能力超出ABAP范围时才建议使用;3)需通过CL_ABAP_DBFEATURES检查数据库支持情况。合理使用FDA可优化批量数据处理,但滥用可能导致性能下降。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1269

vc中使用nmake命令编译方法

        由于最近工程较多,在SI的时候很是麻烦,将所有的工程都编译一次,再将可执行文件和生成的库文件全部拷贝到bin目录下,真的做了一次以后就感觉工作量的巨大,可能也是人比较懒的原因,以前就听说过vc可以用命令行编译于是上网狂搜,终于做了一个p处理,以后省事了,只要不改依存逻辑,以后就一键SI了,哈哈。啊,差点忘了说了,介绍一个我的方法,nmake命令就不多解释了,打-?里面解释都有。

xujianlane的专栏 1万+

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

nmake命令错误问题及解决方法

nmake命令错误:配置环境变量,把nmake.exe的上级目录加到系统环境变量路径里。 试了半天没用。 最后我把vs2019的目录里所有的空格换掉再加到路径里就好了,呃呃无语啊,为什么官方还给目录加空格,这多耽误事啊,而且为什么网上查不到解决办法,难道只有我一个人碰上这种事儿吗无语辣。 ...

隋隋平安 2214

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Windows 下编译库时 出现 NMAKE nmake不是内部命令或外部命令解决方法

nmake不是内部命令或外部命令,也不是可运行程序”问题:   原因:没有安装vc或者没有选择环境变量。   解决方法:安装vc,并选择环境变量;没有正确设置环境变量的,按以下方法:   在我的电脑 >属性 > 高级 > 环境变量中设置“include”“lib”“path”变量的值,   . include:D:\Program Files\Microsoft Visual S

u011937547的专栏 4万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

编译Qt“NMAKE:fatal error U1077”错误的解决方法

编译Qt“NMAKE:fatal error U1077”错误的解决方法 分类: 错误与解决方法 2013-03-18 20:17 1775人阅读 评论(0) 收藏 举报 Qtfatal error U1077        今天编译Qt-4.8.4VS2008 64位的时候,出现“NMAKE:fatal error U1077”的错误,Google了一下找到了解决

yu132563的专栏 1万+

nmake 非内部指令 的解决方法

前提:安装了vs2008 汉化版,操作系统win7 关键字:nmake  非内部指令 开始->所有程序->Microsoft Visual Studio 2008 -> Visual Studio tools -> Visual Studio 2008 命令提示。 执行过一次以后就可以执行nmake了。

梁桥江的专栏 833

Windows平台运行Makefile的三种实用方法:MinGW、NMake与VS Code集成

Makefile作为经典的自动化构建工具,在类Unix系统中通过定义依赖关系和构建规则,极大地简化了C/C++项目的编译流程。其核心原理在于利用时间戳对比,仅重新编译发生变更的源文件,从而提升构建效率。在跨平台开发场景下,这一技术价值尤为凸显,能够确保不同环境下的构建一致性。然而,当项目迁移至Windows平台时,由于原生环境缺乏make工具以及路径、命令的差异,直接运行为Unix-like环境设计的Makefile会遇到障碍。本文聚焦于解决这一工程实践痛点,系统介绍了三种主流方案:通过MinGW/MSYS

weixin_30731305的博客 356

nmake 不能用的解决方法

C:/>call "C:/Program Files/Microsoft Visual Studio 8/VC/bin/vcvars32.bat"

puts "hello saint!" 1334
上一篇: 独立窗口打开多个Excel
下一篇: Source Insight 常用设置
satiling
博客等级 码龄19年 130粉丝 98原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值