makefile教程---nmake命令编译器的使用

一 简介
大家已经习惯于微软提供的功能强大的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)    表示其后的字符串为一文件名。
(     
)     
{    
}    
! (exclamation symbol)    命令修饰符
@ (at sign)    命令修饰符
- (hyphen)    
: (colon)    用于dependent lines和inference rules中,用于分隔target和dependent。
; (semicolon)    如果对于一个dependent line只有一条命令,则可以将该命令放在dependent line的后面,二者之间用“;”分隔。
$ (dolor sign)    用于调用宏

完!


作者:iTech
出处:http://itech.cnblogs.com/ 

nmake命令编译器的使用相关推荐

  1. CMake入门1——CMake与VS编译器和nmake的结合使用

    下载 安装 例1 使用cmake-gui与VS生成器 例3 PreLoadcmake用法 本文描述在Win10-64位系统中安装CMake.cmake-gui的简单使用及其与VS2015编译器的结合使 ...

  2. Win7 64b的VS2015 如何使用nmake成功编译detour express 3.0-error2202 警告被视为错误 - 没有生成“object”文件

    首先打开你的开始目录,找到VS2015,找到如图1所示的开发人员命令提示.打开 图1 从开始菜单打开VS的开发人员命令行 图2 打开VS2015开发人员命令提示 傻瓜式安装detour express ...

  3. NMAKE参考之二——运行NMAKE

    运行NMAKE 你可以使用下面的语法运行NMAKE: NMAKE [options] [macros] [targets] option字段列出NMAKE选项,NMAKE选项会在本文的"命令 ...

  4. 通过cmd命令,使Scite在windows下构建,并安装lua环境与中文乱码问题

    通过cmd命令,使Scite在windows下构建,并安装lua环境与中文乱码问题 Scite工具下载与安装 https://scite.en.softonic.com/download 1.下载完后 ...

  5. nmake工具的用法

    [源] = [<Windows 环境下32位汇编语言程序设计(第2版)>] 2.4 make工具的用法 2.4.1 make工具是什么     在DOS时期编写汇编程序的时候,编译器和链接 ...

  6. 使用NMAKE管理工程

    使用NMAKE管理工程 本章描述了微软程序维护实用工具(NMAKE)版本1.20.NMAKE是一个精巧的命令处理器,它节约了时间并且简化了工程管理.一旦你指出哪些工程文件依赖于其他文件,NMAKE会自 ...

  7. c语言中常用的预处理命令6,C语言的预处理命令

    1.宏替换命令 编译器遇到宏替换命令所定义的标识符时,用其后的字符串替换该标识符.用这种方式定义符号常量.形式如下: #define  标识符 字符串 #define    TRUE     1 // ...

  8. nmake编译libraw

    编译环境:VS2019的nmake libraw:0.20.2 一.使用nmake需要首先设置nmake的环境变量,方法如下: 在系统环境变量path中添加 C:\Program Files (x86 ...

  9. msvc2013编译qt5.6源码

    1.回顾 说起到qt的编译,真是领人痛心啊,不仅编译选项繁多,而且编译时间比较久,总是能使想编译qt源码的人望而却步,呵呵...我就是其中一个,不知道从什么时候开始就想着把qt的源码编译一下,也尝试过 ...

  10. fluent的udf需要c语言环境吗,[转载]FLUENT UDF 使用指导

    |---files |---flgui |---fluent |---graphdev |---graphics |---include (UDS include files) |---interfa ...

最新文章

  1. 大牛整理:java去掉字符串中的逗号
  2. 【SAP干货】创建Search Helps (Elementary and Secondary)
  3. function module COM_PRODUCT_GETDETAIL_INTERNAL的内存分配问题
  4. linux内核grub的作用与用途,linux中grub是干嘛的
  5. ubuntu 修改旋转屏幕显示方向 恢复正常模式
  6. 用sklearn mysql_Sklearn之Linear Regression
  7. hibernate、java、数据库对应类型
  8. PHP微信多级三级分佣系统,微信三级分销系统微信三级分销系统
  9. linux如何共享网络打印机,Ubunt如何安装网络打印机的详细图文步骤
  10. 工具 - 屏幕录像专家7.5注册机
  11. 小程序设置按钮分享功能
  12. HTML做一个传统节日端午节 带设计报告4500字
  13. IntelliJ IDEA Dependency 'XXXX' not found 或 java:程序包XXXX不存在,找不到的解决方案
  14. 在任意位置Reset掉任意的TCP连接
  15. 如何根据公司名称来筛选快递
  16. Geogebra-球坐标系
  17. 蚂蚱跳跃问题 【字节笔试】题目说 ”字节“跳动
  18. 美国PARKER派克永磁高速伺服电机——GVM电机
  19. [Android 之美] 那些你不知道的APK 瘦身,让你的APK更小
  20. 从你的全世界路过- 告白气球

热门文章

  1. java web 留言板设计_JSP+Servlet+JavaBean传统方式实现简易留言板制作(注册、登录、留言)...
  2. Win7 64位系统安装 Windows XP 虚拟机
  3. oracle和timesten整合,Oracle TimesTen 关系型内存数据库18.1新版本详解
  4. 管家婆服装.NET II TOP V6.5-VIP卡使用注意事项(一)
  5. 抱薪者说 | 廿七喜得子老王为名忧,论坛聚英豪树鑫拔头筹
  6. The Django Book-----第一章:介绍Django
  7. 2020年最新测绘规范目录(可下载在线查看相关规范)
  8. 反编译DLL。并且修改DLL内容
  9. html站点地图怎么做,sitemap网站地图(站点地图)如何制作以及作用
  10. 简单c语言图形程序设计,c语言简单图形编程