首页
论坛
课程
招聘
雪    币: 1675
活跃值: 活跃值 (11)
能力值: ( LV15,RANK:670 )
在线值:
发帖
回帖
粉丝

[原创]Windows 下的 Makefile 编写(二)宏和预处理的简单示例

2010-12-23 20:37 7648

[原创]Windows 下的 Makefile 编写(二)宏和预处理的简单示例

2010-12-23 20:37
7648
Windows 下的 Makefile 编写(二)宏和预处理的简单示例

作者:cntrump

在Makefile中使用宏和预处理能明显提高工作的效率。



    宏的语法为:

macroname=string
   

macroname 是字母、数字和下划线 (_) 的组合,最多 1,024 个字符且区分大小写。macroname 可以包含调用的宏。如果 macroname 完全是由调用的宏组成的,则正调用的宏不能为空或未定义。

    宏的使用:

    定义了一个宏之后就可以使用了。使用的方法很简单,如下所示就是一个简单的调用过程:

$(macroname)


使用括号将宏名称括起来,再在前面加上 $ 符号就可以了。在实际中的使用:

objects=stdafx.obj main.obj

Test.exe:$(objects)

    .......


如果string的长度太长或者需要分行显示。可以使用 \ 。反斜框后紧跟着回车就表示换行:

objects=stdafx.obj \

         main.obj

Test.exe:$(objects)


    nmake还内置了用于指定文件名的宏,叫作文件名宏

文件名宏被预定义为依赖项中指定的文件名(而不是磁盘上的完整文件名指定)。在调用时不需要将这些宏括在括号内;只需按如下方式指定 $。


意义

$@
当前所指定的当前目标的全名(路径、基名称、扩展名)。

$$@
当前所指定的当前目标的全名(路径、基名称、扩展名)。仅在作为依赖项中的依赖项时有效。

$*
当前目标的路径和基名称,没有文件扩展名。

$**
当前目标的所有依赖项。

$?
时间戳比当前目标的时间戳晚的所有依赖项。

$<
时间戳比当前目标的时间戳晚的依赖文件。仅在推理规则的命令中有效。

使用文件名宏对编写Makefile是很有帮助的,特别是在文件数量多的时候,可以节省大量时间。例如上面的例子,使用的文件名宏后:

objects=stdafx.obj \

         main.obj

Test.exe:$(objects)

    link.exe $**


这样只需使用 $** 就替代了Test.exe所依赖的所有.obj文件,相当方便。

生成文件预处理

预处理指令不区分大小写。初始感叹号 (!) 必须出现在行首。感叹号后面可以有零个或多个空格或制表符,用于缩进。

下面是经常会用到的预处理:

!MESSAGE text

      用来显示一段文本信息,显示的内容就是text所指定的内容。

!INCLUDE [<]filename[>]

      作用类似于C++ 中的 #include ,将filename包含进来,如果filename里的指令可执行则会先执行其中的指令然后再继续。

!IF constantexpression

如果 constantexpression 计算结果为非零值,则处理 !IF 和下一个 !ELSE 或 !ENDIF 之间的语句。

!IFDEF macroname

如果定义了 macroname,则处理 !IFDEF 和下一个 !ELSE 或 !ENDIF 之间的语句。空宏将被视为尚待定义。

!IFNDEF macroname

如果没有定义 macroname,则处理 !IFNDEF 和下一个 !ELSE 或 !ENDIF 之间的语句。

!ELSE[IF constantexpression | IFDEF macroname | IFNDEF macroname]

如果前面的 !IF、!IFDEF 或 !IFNDEF 语句计算结果为零值,则处理 !ELSE 和下一个 !ENDIF 之间的语句。可选关键字提供了进一步的预处理控制。

!ELSEIF

!ELSE IF 的同义词。

!ELSEIFDEF

!ELSE IFDEF 的同义词。

!ELSEIFNDEF

!ELSE IFNDEF 的同义词。

!ENDIF

标记 !IF、!IFDEF 或 !IFNDEF 块的结尾。同一行上 !ENDIF 后面的所有文本被忽略。

!UNDEF macroname

取消定义 macroname。

预处理数量虽然不少,但是很多都有其同义预处理。只需要记忆其中一个就可以了。

最后用一个简单的示例来说明宏和预处理的应用,附件中的例子是使用VC6生成的一个Hello World控制台程序,及其相应的Makefile编写方法。

在VC6的命令提示符下,生成Release版的命令为:

nmake clean cfg=Release


生成Debug版的命令为:

    nmake clean cfg=Debug


现在,你已经具有编写简单Makefile的能力了。

btw:
PDF文件中还有附件,里面是例子代码。

HWS计划·2020安全精英夏令营来了!我们在华为松山湖欧洲小镇等你

上传的附件:
最新回复 (5)
雪    币: 208
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
aca 活跃值 2010-12-25 07:36
2
0
学习,很有用
雪    币: 564
活跃值: 活跃值 (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
lixupeng 活跃值 2010-12-25 08:43
3
0
备用!!!^_^
雪    币: 189
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
adomore 活跃值 2010-12-26 12:40
4
0
感谢楼猪分享了!先学习了!
雪    币: 202
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
门栓 活跃值 2010-12-28 21:04
5
0
谢谢楼主,下载收藏了.
雪    币: 367
活跃值: 活跃值 (10)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
cnhnyu 活跃值 2 2010-12-31 15:17
6
0
顶, 严重支持
游客
登录 | 注册 方可回帖
返回