1.15 自动化构建过程
到目前为止,每当编译和运行程序时,都需要键入较长的命令行,用户可能会觉得有些麻烦。当用户开始向ml64和cl命令中添加更多命令行选项时,尤其感觉如此。请考虑以下的两个命令:
ml64/nologo/c/Zi/Cp listing1-8.asm
cl/nologo/O2/Zi/utf-8/EHa/Felisting1-8.exe c.cpp listing1-8.obj
listing1-8
“/Zi”选项指示MASM和MSVC将额外的调试信息编译到代码中。“/nologo”选项指示MASM和MSVC在编译期间跳过打印有关版权以及版本的信息。MASM的“/Cp”选项指示MASM在编译时不区分大小写(以便用户在编写汇编语言源文件中不需要使用“options casemap:none”伪指令)。“/O2”选项指示MSVC优化编译器生成的机器代码。“/utf-8”选项指示MSVC使用utf-8 Unicode进行编码(这是ASCII兼容的编码),而不是utf-16编码(或者其他字符编码)。“/EHa”选项指示MSVC处理处理器生成的异常(例如内存访问故障——汇编语言程序中一种常见的异常)。“/Fe”选项指定可执行的输出文件名。每当用户想要构建一个示例程序时,键入所有这些命令行选项将是一项艰巨的工作。
最简单的解决方案是创建一个批处理文件,使构建过程自动化。例如,用户可以在文本文件中键入前面的3个命令行,将该文本文件命名为l8.bat,然后只须在命令行中键入l8即可自动执行这3个命令。这省去了大量的键入工作,还不容易出错。
将这3个命令放入批处理文件的唯一缺点是,该批处理文件只适用于listing1-8.asm源文件,在编译其他程序时用户必须创建一个新的批处理文件。幸运的是,很容易创建一个用于处理任何单个汇编程序源代码文件的批处理文件,该批处理文件对汇编程序源文件进行编译,并链接到通用c.cpp程序。请考虑下面的build.bat批处理文件:
echo off
ml64/nologo/c/Zi/Cp%1.asm
cl/nologo/O2/Zi/utf-8/EHa/Fe%1.exe c.cpp%1.obj
这些命令中的“%1”项用于指示Windows命令行处理器,使用命令行参数(特别地,命令行参数数字1)代替%1。如果从命令行键入以下的内容:
build listing1-8
那么,Windows将执行以下3个命令:
echo off
ml64/nologo/c/Zi/Cp listing1-8.asm
cl/nologo/O2/Zi/utf-8/EHa/Felisting1-8.exe c.cpp listing1-8.obj
使用这个build.bat文件,只须在build命令行上指定汇编语言源文件名(不带.asm后缀),即可编译多个项目。
build.bat在编译并链接程序后,不会运行它。用户可以通过在批处理文件末尾附加一行包含%1的内容,将运行功能添加到批处理文件中。但是,当编译因为C++或汇编语言源文件中的错误而失败时,批处理文件也会尝试运行程序。因此,在使用批处理文件构建程序后,最好手动运行所生成的程序,如下所示:
C:\>build listing1-8
C:\>listing1-8
可以肯定的是,手动方式稍微多一些键入操作,但从长远来看更安全。
微软公司提供了另一个从命令行控制编译的有用工具:makefiles。这是一个比批处理文件更好的解决方案,因为makefiles允许用户根据前面步骤的成功情况,有条件地控制流程中的执行步骤(例如运行可执行文件)。但是,使用微软公司的make程序(nmake.exe)超出了本章的知识范围。make程序是一个值得学习的好工具(第15章将简单介绍该工具的基础知识)。然而,批处理文件对于本书大部分内容中出现的简单项目来说已经足够了,并且使用者只需要很少的额外知识或培训。如果用户有兴趣了解有关makefiles的更多信息,请参阅第15章或者1.17节。