PC-lint安装及使用总结 .pdf

上传人:C****o 文档编号:39729055 上传时间:2022-09-07 格式:PDF 页数:35 大小:1.85MB
返回 下载 相关 举报
PC-lint安装及使用总结 .pdf_第1页
第1页 / 共35页
PC-lint安装及使用总结 .pdf_第2页
第2页 / 共35页
点击查看更多>>
资源描述

《PC-lint安装及使用总结 .pdf》由会员分享,可在线阅读,更多相关《PC-lint安装及使用总结 .pdf(35页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、PC-lint 研究总结1.PC-lint总体介绍 .22.安装和配置.22.1 安装.22.2 配置.33.使用方法.14 3.1 命令行方式.14 3.2 集成到 IDE方式 .15 3.2.1 集成到 VC 中.15 3.2.2 集成到 CB中.17 3.2.3 集成到 SI中.20 3.2.4 集成到 UE中.23 3.3 makefile 方式.24 3.3.1 GNU Make 和makefile 介绍 .24 3.3.1.1 GNU Make.24 3.3.1.2 makefile 基本结构.25 3.3.1.3 makefile 变量.26 3.3.1.4 GNU make 的

2、主要预定义变量.26 3.3.1.5 隐含规则.27 3.3.2 平台的 makefile结构.27 3.3.2.1 平台级.28 3.3.2.2 子系统级(以支撑为例).28 3.3.2.3 平台 makefile 的调用方式.29 3.3.3 平台 makefile 同PC-lint 的集成 .29 4.平台推广方案(建议).34 4.1 推广使用的前提.34 4.2 个人的使用方案.34 4.3 子系统的检查人的使用方案.34 4.4 特殊情况处理方法.34 名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 35 页 -1.PC-lint 总体介绍PC-Lint/FlexeL

3、int for C/C+是 GIMPEL SOFTWARE公司的产品,是C/C+软件代码静态分析工具,你可以把它看作是一种更加严格的编译器。它除了可以检查出一般的语法错误外,还可以检查出那些虽然符合语法要求,但很可能是潜在的、不易发现的错误。C 语言的灵活性带来了代码效率的提升,但相应带来了代码编写的随意性,另外C 编译器不进行强制类型检查,也带来了代码编写的隐患。PC-Lint 识别并报告C 语言中的编程陷阱和格式缺陷的发生。它进行程序的全局分析,能识别没有被适当检验的数组下标,报告未被初始化的变量,警告使用空指针,冗余的代码,等等。软件除错是软件项目开发成本和延误的主要因素。PC-lint

4、能够帮你在程序动态测试之前发现编码错误。这样消除错误的成本更低。PC-lint 全球拥有广泛的客户群,因为它性价比高,易于学习,容易推广和固化到软件开发测试流程中去。使用方法很简单,可以用命令行方式进行,例如lint-nt u std.lnt test1.c test2.c test3.c。另外支持MAKEFILE方式。也可以集成到开发环境中。如集成到Source Insight/SLICKEDIT/MS VC6.0/KEIL C.等。如微软公司,都把它作为程序检查工具,在程序合入正试版本或交付测试之前一定要保证通过了LINT 检查,他们要求软件工程师在使用LINT 时要打开所有的编译开关,如

5、果一定要关闭某些开关,那么要给出关闭这些开关的正当理由。由于越来越多的用户要求能在非PC 的平台上使用PC-Lint,GIMPEL 公司采用了标准C源码包的方式发布了FlexeLint,这样一来,FlexeLint就可被用户方便的移植在各种的平台上。2.安装和配置2.1 安装由于此版本比较特殊,故无需安装,只需要将RAR 压缩包里的所有文件解压到一个目录下即可,这里假定为C:PCLint8 目录。解压之后目录中文件及目录的说明如下:lint-nt.exe PC-lint 可执行程序;config.exe 配置向导;read80.txt 手册的补充说明,最新特性的更新都在这里说明;pc-lint

6、.pdf PC-Lint英文参考手册,许多问题的答案可以在这里找到;pr.exe 打印工具;msg.txt文本格式的错误号信息解释文件;patch.exe LINT补丁升级工具;Lnt 包含各种 lnt配置文件的目录,文件如下:co-.lnt 各种特定的编译器的配置文件;co.lnt 通用的编译器配置文件;sl-.c 支持各种非 ANSI 标准编译器的标准库模块;sl.c 支持 ANSI 标准的通用编译器的标准库模块;env-.lnt 支持包括微软Visual Studio 在内的各种开发环境以及多种编辑工具的配名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 35 页 -置文件;

7、lib-.lnt 支持各种特定库的配置选项文件;au-.lnt 作者编程建议的配置文件;.包含各种测试源文件的目录。2.2 配置假定我们为Microsoft Visual C+6的开发环境进行配置,运行C:PCLint8config.exe进行配置。1)运行 C:PCLint8config.exe后出现如下画面,选择下一步;图 2.2.1 2)出现命令行使用的说明窗口,选择下一步;名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共 35 页 -图 2.2.2 说明:LIN.BAT,OPTIONS.LNT,STD.LNT 为成功运行完此配置向导后自动生成的文件。LINT-NT 实际上就

8、是LINT-NT.EXE命令。LIN.BAT中的命令语句形式还可在IDE或编辑器里使用;3)选择是创建或修改已有配置文件STD.LNT 的选项,这里我们是第一次配置,故选择上面一个选项Create a new STD.LNT,不修改配置路径,然后选择下一步;名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 35 页 -图 2.2.3 说明:界面中配置路径不修改的话就是PC-Lint 安装的路径 C:PCLint8,新建的 STD.LNT就存放在这个目录下,当然用户也可选择另外的配置路径存放生成的STD.LNT。4)接下来是选择编译器,在下拉框中选择自己使用的编译器。这里我们选择Mi

9、crosoft Visual C+6.x(co-msc60.lnt),点击下一步;名师资料总结-精品资料欢迎下载-名师精心整理-第 5 页,共 35 页 -图 2.2.4 说明:如果没有自己使用的编译器,可选择通用编译器:Generic Compilers。这个选项会体现在co-xxx.lnt文件中,并存放在前面我们选择的配置路径(C:PCLint8)下,在后面配置选项我们所选择的*.LNT均会被存放到这个路径下。5)接着会让你选择一个的内存模型,可以根据自己程序区和数据区的实际大小选择一个恰当的内存模型。内存模型的选项会体现在STD.LNT 文件中。缺省选择32-bit Flat Model

10、.,然后选下一步;名师资料总结-精品资料欢迎下载-名师精心整理-第 6 页,共 35 页 -图 2.2.5 6)选完内存模型后,会看到一个库类型的列表,在这里选择一个或多个编译时使用的库。建议选择Microsofts Foundation Class library 和 Windows NT,Windows 32-bit,如果你用到了Standard Template Library,当然也选上,选择下一步;名师资料总结-精品资料欢迎下载-名师精心整理-第 7 页,共 35 页 -图 2.2.6 说明:各种库的配置文件名为lib-xxx.lnt,配置向导会把选中的库的lnt 配置文件拷贝到配置

11、路径下。7)接着是让你选择为使用C/C+编程提出过重要建议的作者,选择的某作者后,他提出的编程建议方面的选项将被打开,作者建议的配置名为AU-xxx.LNT。建议全部选择,选择下一步;图 2.2.7 说明:同样,选中作者建议的AU-xxx.LNT,也会被配置向导拷贝到配置路径下。8)下一步是选择用何种方式设置包含文件目录。这里我们选择用-i 方式协助我们来设置,然后选择下一步;名师资料总结-精品资料欢迎下载-名师精心整理-第 8 页,共 35 页 -图 2.2.8 说明:这里有两种选项:第一种选项是使用-i 选项协助我们设置,-i 选项体现在STD.LNT文件中,每个目录前以-i 引导,目录间

12、以空格分隔。第二种是跳过这一步,手工设置。建议选择第一种。9)如果步骤 8 中选择使用-i 选项,安装程序会接着让你输入包含文件所在的目录。在下面的文本框里,可手工输入文件包含路径,用分号“;”或用 ctrl+Enter 换行来分割多个包含路径。或者可以点中Brows,在目录树中直接选择。填完后选择下一步;名师资料总结-精品资料欢迎下载-名师精心整理-第 9 页,共 35 页 -图 2.2.9 说明:如果不输入包含文件目录,直接选择下一步,在安装完成后在std.lnt 文件中手工添加,注意如果目录名中有长文件名,使用时要加上双引号”,如-i”E:Program FilesMSVCVC98Ind

13、lue”。10)然后出现以下对话框,表示 std_a.lnt,std.lnt 在配置路径下已被创建,这里的 std.lnt实际上就是std_a.lnt 的一个拷贝,只是在缺省方式下,lint 时使用的配置文件是std.lnt;图 2.2.10 选择确定后,这里将会问你是否进行另一个编译环境的配置。这里我们选择否。名师资料总结-精品资料欢迎下载-名师精心整理-第 10 页,共 35 页 -图 2.2.11 说明:如果选是,将会从第 4 步开始进行配置,在配置完了包含路径后,会出现下面的对话框,表示另一个编译环境的std_b.lnt 配置文件在配置路径下被创建,并且问你是否要用这个文件替换已经存在

14、的std.lnt,以使得最后配置的编译环境的配置成为lint 时的缺省配置。图 2.2.12 11)接下来将会准备产生一个控制全局编译信息显示情况的选项文件OPTIONS.LNT,这里选择 No,即不取消这些选项。图 2.2.13 名师资料总结-精品资料欢迎下载-名师精心整理-第 11 页,共 35 页 -说明:该文件的产生方式有两种,一种是安装程序对几个核心选项逐一解释并提问你是否取消该选项,如果你选择取消,则会体现在OPTIONS.LNT 文件中,具体体现方式是在该类信息编码前加-e,后面有一系列逐一选择核心选项的过程。如果选择第二种选择方式,安装文件会先生成一个空的OPTIONS.LNT

15、 文件,等你以后在实际应用时加入必要的选项。12)接着选择所支持的集成开发环境选项,可选多个或一个也不选,PC-LINT提供了集成在多种开发环境中工作的功能,例如可集成在VC、BC、Source Insight 中。这里我们选择MS VC+6,这样 env-v6.lnt 就会被拷贝到配置路径中。图 2.2.14 13)安装程序会生成一个LIN.BA T 文件,该文件是运行PC-LINT 的批处理文件,为了使该文件能在任何路径下运行,安装程序提供了两种方法供你选择。第一种方法是让你选择把LIN.BAT拷贝到任何一个PATH目录下。第二种方法是生成一个LSET.BAT 文件,在每次使用PC-LIN

16、T 前先运行它来设置路径,或者把LSET.BAT文件的内容拷贝到AUTOEXEC.BA T 文件中。建议选择第一种方法,指定的目录为安装目录。名师资料总结-精品资料欢迎下载-名师精心整理-第 12 页,共 35 页 -图 2.2.15 图 2.2.16 14)配置完毕。名师资料总结-精品资料欢迎下载-名师精心整理-第 13 页,共 35 页 -图 2.2.17 说明:以上配置过程中在配置路径下产生的多个*.lnt文件,除了std.lnt,std_a.lnt,std_b.lnt,option.lnt为配置向导所生成,其它co-xxx.lnt,lib-xxx.lnt,env-xxx.lnt均是从C

17、:Lint8lnt中拷贝出来的,在这个目录下还有其它PCLint 所支持的编译器、库及集成开发环境的 lnt 配置文件,所有的lnt 文件均为文本文件。上面的配置方法适合于刚开始接触PC-lint 时使用,对于熟练的使用者可以直接编辑、编写各*.lnt 配置文件安成上面的配置工作,或者定制出更适合自己使用的配置环境。3.使用方法3.1 命令行方式命令行的使用方式是PC-lint 最基本的使用方式,也是其他各种集成使用方式的基础,通过命令行可以完成PC-lint 的全部代码分析工作。PC-lint 的命令行有下列形式:Lint-nt option file1 file1 file3 其中的 Li

18、nt-nt 是 PC-lint 的可执行程序(见 2.1 安装),它完成 PC-lint 的基本功能;option代表 PC-lint 可接受的各种选项,这是PC-lint 最为复杂的部分,它的选项有300 多种,可以分为:错误信息禁止选项、变量类型大小选项、冗余信息选项、标志选项、输出格式选项和其他选项等几类,后面会有更多 的介绍;file 为待检查的源文件。另外值得注意的一点是,在命令行中可以加入前面提到的*.lnt配置文件名,并可以把它看作是命令行的扩展,其中配置的各种选项和文件列表,就和写在命令行中具有一样的效果。名师资料总结-精品资料欢迎下载-名师精心整理-第 14 页,共 35 页

19、 -3.2 集成到 IDE方式3.2.1 集成到 VC中在集成开发环境中,PC-Lint 8.0 对 VC+6 和 VC+7.0 的支持是最完善的,支持直接从VC 的工程文件(VC6 是*.dsp,VC7 是*.vcproj)导出对应工程的.Lnt 文件,此文件包含了工程设置中的预编译宏,头文件包含路径,源文件名,无需人工编写工程的.Lnt 文件。下面是集成到的VC6 中的 tools 设置说明,参见C:Lint8lntenv-vc6.lnt中的注释:导出当前工程的.lnt 文件(用来导出工程设置和源文件名,头文件包含路径),下面的对话框点击菜单的Tools-Customize-Tools 可

20、以看到。图 3.2.1.1 PC_LINT 8.0 Export Project.Lnt Command:C:PCLint8LINT-NT.EXE Arguments:+linebuf$(TargetName).dsp$(TargetName).lnt Initial directory:$(TargetDir).当修改过工程设置中的头文件包含路径、预编译宏或新增源文件后,需要重新导出工程的 lnt 文件,否则修改后的设置无法自动体现在工程的lnt 文件中。以上设置只要修改Command 中的Lint-nt.exe所在路径即可。执行过这个命令后,$(TargetName).lnt 被放到$(T

21、argetName).dsp 所在目录中($(TargetDir).下),如果成功,打印出 的 返 回 值 为0,如 果 失 败 则 返 回 非 零 值,具 体 出 错 信 息 需 查 看$(TargetDir).$(TargetName).lnt 文件内容。其中$()的字串为VC 的参数宏,调用工具命令时VC 将它们替换为对应的字符串。$(TargetName)为当前激活的工程名(通过菜单Project-Set Active Project 设置当前激活工程,或在 WorkSpace 的工程树上右键对应的工程选择Set as Active Projec),$(TargetDir)为当前激活工

22、程输出目标文件所在路径(一般缺省为工程所在目录下的Debug 或 Release目录),具体参数宏的含义说明参考MSDN 中的 VC 的使用指南。名师资料总结-精品资料欢迎下载-名师精心整理-第 15 页,共 35 页 -在 Initial directory 的$(TargetDir).表示在这个目录下执行此命令。注:参数+linebuf 表示加倍行缓冲的大小,最初是600 bytes。行缓冲用于存放当前行和你读到的最长行的信息。检查当前激活工程中当前窗口中的源文件。图 3.2.1.2 PC_LINT 8.0 For Unit Check Command:C:PCLint8LINT-NT.E

23、XE Arguments:-iC:PCLint8-u std.lnt env-vc6.lnt$(TargetName).lnt$(FilePath)Initial directory:$(TargetDir).注意这一步最容易出错误。与。,路径不同,会出现找不到头文件的路径的情况执行此命令前提是$(TargetDir).目录下已经有工程的$(TargetName).lnt 文件,这个文件在步骤 1 中生成。第一个参数-iC:PCLint8 为 lint 搜索*.lnt 文件的目录,这里就是我们的配置路径。std.lnt 就是前面配置过程中生成编译环境的配置文件,如果有需要支持多个编译环境,可以

24、直接改成对应的配置文件名,例如这里可以改为std_a.lnt,表示使用std_a.lnt 中所配置的编译环境设置。最后一个参数$(FilePath)就是当前窗口中的带路径的源文件名。需要注意的是,当前窗口中打开的源文件一定要属于当前激活的工程,否则lint 可能会出错。检查当前激活工程中的所有源文件。名师资料总结-精品资料欢迎下载-名师精心整理-第 16 页,共 35 页 -图 3.2.1.3 PC_LINT 8.0 For Project Check Command:C:PCLint8LINT-NT.EXE Arguments:+ffn-iC:PCLint8 std.lnt env-vc6.

25、lnt$(TargetName).lnt Initial directory:$(TargetDir).执行此命令前提是$(TargetDir).目录下已经有工程的$(TargetName).lnt 文件,这个文件在步骤 1 中生成。此命令把$(TargetName).lnt 中所包含的源文件lint 一遍,如果工程比较大的话,一般输出的内容会超过VC 的输出窗口的缓冲区大小,导致只能看到后面一部分Lint 的信息,可以把 Arguments改为+ffn-iC:PCLint8 std.lnt env-vc6.lnt$(TargetName).lnt$(TargetName).txt 把结果输出

26、到一个名为$(TargetName).txt 的文件里。注:参数中的+ffn表示 Full File Names,可被用于控制是否使用的完整路径名称表示。3.2.2 集成到 CB中从 PC-Lint8.0j 版本开始,支持从C+Builde 6 的工程文件.bpr 导出工程的Lint 配置。自动导出C+Builder6 的工程设置lnt 文件的方法参见C:Lint8read80.txt 中的说明,下面是集成到的CBuilder6 中的 tools 设置说明:运行 C:Lint8Config.exe将 lint 环境配置为C+Builder 的。要求需要lint 的工程的工程文件.bpr,源文件

27、.c、.cpp 和最后工程生成的最终文件这3者要在同一个目录下,否则下面说明中的Working dir 要手工修改。导出当前工程的.lnt 文件(用来导出工程设置和源文件名,头文件包含路径):从 C+Builder 的 Tools 菜单中选择“Configure Tools”命令项,在打开的Tool Options 对话框中点击Add 按钮。按图 填入各项参数。由于CBuilder6 对命令行参数传递重定向命令的处理有问题,所以名师资料总结-精品资料欢迎下载-名师精心整理-第 17 页,共 35 页 -还需要编写一个LINTEXP.BAT完成此功能。图 中各参数的内容参见后面的LINTEXP.

28、BAT批处理文件内容的注释。图 3.2.2.1 LINTEXP.BA T 的内容如下:echo off rem Title:&Export Project.Lnt file rem Program:E:BorlandCBuilder6BinLINTEXP.BAT rem Parameters:$NAMEONL Y($EXENAME).bpr$NAMEONLY($EXENAME).lnt echo on C:Lint8LINT-NT.EXE+fpa-dBCB=e:borlandcbuilder6%1%2 其中E:BorlandCBuilder6为C+Builder6的安装目录,需根据实际情况修改

29、。$NAMEONL Y()是 CBuilder6 提供的一个宏函数,将文件名的后缀去掉,$EXENAME代表了工程最后生成的文件名,这里要求它和工程的.bpr 去掉后缀的文件名同名。检查当前工程中当前窗口中的源文件:图 3.2.2.2 Title:Lint For Current File Program:C:Lint8LINT-NT.EXE Parameters:$SAVE-u-v-iC:Lint8 std env-cb$NAMEONL Y($EXENAME).lnt$EDNAME 和 VC6 的集成方法一样,由于参数中需要工程的lnt 文件,执行此命令前提是源文件所在目录下已经有工程的$N

30、AMEONL Y($EXENAME).lnt文件,这个文件在步骤3 中生成。其中$EDNAME表示当前编辑的源文件名。名师资料总结-精品资料欢迎下载-名师精心整理-第 18 页,共 35 页 -检查当前工程中的所有源文件。图 3.2.2.3 Title:&Lint For Current Project Program:C:Lint8LINT-NT.EXE Parameters:$SAVEALL-v-iC:Lint8 std env-cb$NAMEONLY($EXENAME).lnt 执行此命令前提是源文件所在目录下已经有工程的$NAMEONL Y($EXENAME).lnt文件,这个文件在步

31、骤3 中生成。设置 Build Tool在 Project Manager 中检查指定的单个源文件:从 C+Builder 的 Tools 菜单中选择“Build Tools”命令项,在打开的 Build Tools 对话框中点击 Add 按钮。按图 填入各项参数。图 3.2.2.4 Title:Lint Other Extensions:.cpp;.c;.cxx Command Line:C:Lint8LINT-NT.EXE-u-iC:Lint8 std.lnt env-cb.lnt-i$INCLUDEPATH-D$DEFINE$NAME$SAVE 名师资料总结-精品资料欢迎下载-名师精心整

32、理-第 19 页,共 35 页 -其中$INCLUDEPA TH 为工程设置中的include 路径,$DEFINE 为工程设置的预编译宏。添加后,如图在 Project Manager 中的源文件上点击鼠标右键,选择 Lint 就开始检查选中的文件了,输出信息在Build 窗口。图 3.2.2.53.2.3 集成到 SI中Source Insight 的集成方法参见C:Lint8lntenv-si.lnt中的注释。从 Options 菜单中选择“Custom Commands”命令项。点击Add。在 Name 栏中输入“PC-lint unit check”,原则上这个名称可以随便起,只要你

33、能搞清楚它的含义就可以了。在 Run 栏中输入“C:Lint8lint-nt-u-iC:Lint8 std env-si%f”其中 C:Lint8 是你 PC-LINT的安装目录。在 Output 栏中选择“Iconic Window”、“Capture Output”。在 Control 栏中选择“Save Files First”。在 Source Links in Output 栏中选择“Parse Links in Output”、“File,then Line”。在 Pattern 栏中输入“(*)(0-9+)”。点 Close 键加入该命令。如下图:名师资料总结-精品资料欢迎下载-

34、名师精心整理-第 20 页,共 35 页 -图 3.2.3.1 使 用 时,在Source Insight下 打 开 要LINT的 文 件,打 开Options菜 单 中 的“Custom Commands”命令项,在“Command”栏中选择“PC-lint unit check”命令运行即可。请注意,不论你怎样配置参数一定不要忘记了将env-si.lnt 包含在你的配置文件里,否则就无法进行错误信息和程序的自动对应了。用 Menu 命令把 PC_Lint 添加到菜单中。名师资料总结-精品资料欢迎下载-名师精心整理-第 21 页,共 35 页 -图 3.2.3.2 至此,你可以运行sourc

35、e insight下集成的PC Lint功能完成对代码的走查,并且很方便的找到错误信息的位置。图 3.2.3.3 在错误信息处点击旁边的红色图标,就会自己跳转至错误出现处。上图就是一个不安全变量转换的警告信息。以上是对在source insight3.5 中使用集成PC-lint 的一个总结。我们可以看到该方式使用PC-lint 简单易用,容易查找到错误,但考虑只能做当前文件的单元检查,需要自己指定Include 目录和需要自己定义相关的宏等,设置过程比较麻烦,并且不够通用。此方式适合个人维护自己的代码用,对于整个部门的代码的走查,还是采取makefile 的方式比较好。名师资料总结-精品资料

36、欢迎下载-名师精心整理-第 22 页,共 35 页 -3.2.4 集成到 UE中图 3.2.4.1(1)从 UltraEdit 的菜单中进入 (2)栏输入“PC-lint unit check”(3)栏输入以下命令:C:PCLint8LINT-NT u-iC:PCLint8si std env-si%f 其中,C:PCLint8 是 PC-Lint 的安装目录(4)栏输入以下路径:x:code(5)选中 的复选框(6)在 栏中,选中 和(7)点 将命令行插入UltraEdit 的菜单,此时在UltraEdit 的菜单中会增加一个 栏目,点击该栏目即可对当前文件执行PC-lint。检查的执行结果

37、如下图所示:名师资料总结-精品资料欢迎下载-名师精心整理-第 23 页,共 35 页 -图 3.2.4.2 3.3 makefile 方式这里 makefile 指的是一类文件,用在C/C+的 Make 工具中,Make 工具通过makefile文件来描述源程序之间的相互关系,并自动维护编译工作。Makefile 文件按照特定的语法进行编写,文件中需要说明如何编译各个源文件,并连接生成可执行文件。Makefile 文件作为一种描述文档一般需要包含以下内容:宏定义 源文件之间的相互依赖关系 可执行的命令Makefile 中允许使用简单的宏指代源文件及其相关编译信息,也称宏为变量。在引用宏时只需在

38、变量前加$符号,但值得注意的是,如果变量名的长度超过一个字符,在引用时就必须加圆括号()。平台目前使用的Make 工具是 Tornado 集成环境中的自带的make.exe(一般位于 Tornado安装目录 hostx86-win32bin),它实际上是GNU Make version 3.74(vpath+),以上的版本信息具体情况可能会略有不同,可以通过make v 来查看。那么,在说明平台的makefile 结构和如何将PC-lint 结合到makefile 中使用之前,先来介绍GNU Make 及makefile。3.3.1 GNU Make 和makefile 介绍3.3.1.1 G

39、NU Make 在大型的开发项目中,通常有几十到上百个的源文件,如果每次均手工键入gcc 命令进行编译的话,则会非常不方便。因此,人们通常利用make 工具来自动完成编译工名师资料总结-精品资料欢迎下载-名师精心整理-第 24 页,共 35 页 -作。这些工作包括:如果仅修改了某几个源文件,则只重新编译这几个源文件;如果某个头文件被修改了,则重新编译所有包含该头文件的源文件。利用这种自动编译可大大简化开发工作,避免不必要的重新编译。实际上,make 工具通过一个称为makefile 的文件来完成并自动维护编译工作。makefile 需要按照某种语法进行编写,其中说明了如何编译各个源文件并连接生

40、成可执行文件,并定义了源文件之间的依赖关系。当修改了其中某个源文件时,如果其他源文件依赖于该文件,则也要重新编译所有依赖该文件的源文件。makefile 文件是许多编译器,包括Windows NT 下的编译器维护编译信息的常用方法,只是在集成开发环境中,用户通过友好的界面修改makefile 文件而已。默认情况下,GNU make 工具在当前工作目录中按如下顺序搜索makefile:*GNUmakefile*makefile*Makefile 在 UNIX 系统中,习惯使用Makefile 作为makfile 文件。如果要使用其他文件作为makefile,则可利用类似下面的make 命令选项指

41、定makefile 文件:$make-f Makefile.debug 3.3.1.2 makefile 基本结构makefile 中一般包含如下内容:*需要由make 工具创建的项目,通常是目标文件和可执行文件。通常使用“目标(target)”一词来表示要创建的项目。*要创建的项目依赖于哪些文件。*创建每个项目时需要运行的命令。例如,假设你现在有一个C/C+源文件test.C,该源文件包含有自定义的头文件test.h,则目标文件test.o 明确依赖于两个源文件:test.C 和 test.h。另外,你可能只希望利用g+命令来生成test.o 目标文件。这时,就可以利用如下的makefile

42、 来定义test.o 的创建规则:#This makefile just is a example.#The following lines indicate how test.o depends#test.C and test.h,and how to create test.o test.o:test.C test.h g+-c-g test.C 从上面的例子注意到,第一个字符为#的行为注释行。第一个非注释行指定test.o 为目标,并且依赖于test.C 和 test.h 文件。随后的行指定了如何从目标所依赖的文件建立目标。当 test.C 或 test.h 文件在编译之后又被修改,则m

43、ake 工具可自动重新编译test.o,如果在前后两次编译之间,test.C 和 test.h 均没有被修改,而且test.o 还存在的话,就没有必要重新编译。这种依赖关系在多源文件的程序编译中尤其重要。通过这种依赖关系的定义,make 工具可避免许多不必要的编译工作。当然,利用Shell 脚本也可名师资料总结-精品资料欢迎下载-名师精心整理-第 25 页,共 35 页 -以达到自动编译的效果,但是,Shell 脚本将全部编译任何源文件,包括哪些不必要重新编译的源文件,而make 工具则可根据目标上一次编译的时间和目标所依赖的源文件的更新时间而自动判断应当编译哪个源文件。一个makefile

44、文件中可定义多个目标,利用make target 命令可指定要编译的目标,如果不指定目标,则使用第一个目标。通常,makefile 中定义有clean 目标,可用来清除编译过程中的中间文件,例如:clean:rm-f*.o 运行make clean 时,将执行rm-f*.o 命令,最终删除所有编译过程中产生的所有中间文件。3.3.1.3 makefile 变量GNU 的 make 工具除提供有建立目标的基本功能之外,还有许多便于表达依赖性关系以及建立目标的命令的特色。其中之一就是变量或宏的定义能力。如果你要以相同的编译选项同时编译十几个C 源文件,而为每个目标的编译指定冗长的编译选项的话,将是

45、非常乏味的。但利用简单的变量定义,可避免这种乏味的工作:#Define macros for name of compiler CC=gcc#Define a macr o for the CC flags CCFLAGS=-D_DEBUG-g-m486#A rule for building a object file test.o:test.c test.h$(CC)-c$(CCFLAGS)test.c 在上面的例子中,CC 和 CCFLAGS 就是make 的变量。GNU make 通常称之为变量,而其他UNIX 的 make 工具称之为宏,实际是同一个东西。在makefile 中引用变

46、量的值时,只需变量名之前添加$符号,如上面的$(CC)和$(CCFLAGS)。3.3.1.4 GNU make 的主要预定义变量GNU make 有许多预定义的变量,这些变量具有特殊的含义,可在规则中使用。表 1-5 给出了一些主要的预定义变量,除这些变量外,GNU make 还将所有的环境变量作为自己的预定义变量。表 1-5 GNU make 的主要预定义变量预定义变量含义$*不包含扩展名的目标文件名称。$+所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件。$第一个依赖文件的名称。$?所有的依赖文件,以空格分开,这些依赖文件的修改日期比目标的创建日期晚。名师资料总结-精

47、品资料欢迎下载-名师精心整理-第 26 页,共 35 页 -$目标的完整名称。$所有的依赖文件,以空格分开,不包含重复的依赖文件。$%如果目标是归档成员,则该变量表示目标的归档成员名称。例如,如果目标名称为mytarget.so(image.o),则$为 mytarget.so,而$%为 image.o。AR 归档维护程序的名称,默认值为ar。ARFLAGS 归档维护程序的选项。AS 汇编程序的名称,默认值为as。ASFLAGS 汇编程序的选项。CC C 编译器的名称,默认值为cc。CFLAGS C 编译器的选项。CPP C 预编译器的名称,默认值为$(CC)-E。CPPFLAGS C 预编译

48、的选项。CXX C+编译器的名称,默认值为g+。CXXFLAGS C+编译器的选项。FC FORTRAN 编译器的名称,默认值为f77。FFLAGS FORTRAN 编译器的选项。3.3.1.5 隐含规则GNU make 包含有一些内置的或隐含的规则,这些规则定义了如何从不同的依赖文件建立特定类型的目标。GNU make 支持两种类型的隐含规则:*后缀规则(Suffix Rule)。后缀规则是定义隐含规则的老风格方法。后缀规则定义了将一个具有某个后缀的文件(例如,.c 文件)转换为具有另外一种后缀的文件(例如,.o 文件)的方法。每个后缀规则以两个成对出现的后缀名定义,例如,将.c 文件转换为

49、.o 文件的后缀规则可定义为:.c.o:$(CC)$(CFLAGS)$(CPPFLAGS)-c-o$*模式规则(pattern rules)。这种规则更加通用,因为可以利用模式规则定义更加复杂的依赖性规则。模式规则看起来非常类似于正则规则,但在目标名称的前面多了一个%号,同时可用来定义目标和依赖文件之间的关系,例如下面的模式规则定义了如何将任意一个X.c 文件转换为X.o 文件:%.c:%.o$(CC)$(CFLAGS)$(CPPFLAGS)-c-o$3.3.2 平台的 makefile结构平台的 makefile 文件也称为工程文件,主要由名为makefile 和*.mak 的两类文件构成。

50、平台的 makefile 文件可以分为两个等级:平台级和子系统级。平台级的 makefile 是生成最终的执行代码的工程文件,它还需要调用源程序体系中的子系统级的工程文件(或更深级别的工程文件)来最终完成自己的工作,它一般位于一级目录中的 PROJECT 目录。名师资料总结-精品资料欢迎下载-名师精心整理-第 27 页,共 35 页 -子系统级的makefile,主要是根据不同的编译选项来生成各种类型的目标文件(例如、各种逻辑单板的DEBUG、RELEASE 版),它一般分布在一级目录CODE 的各子系统、模块的目录中。它所需的各种选项由平台级的工程文件传递下来。PROJECT 目录的组织规则

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高考资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁