跟我一起写Makefile可以注释版资料下载.pdf

上传人:b****2 文档编号:16122378 上传时间:2022-11-20 格式:PDF 页数:78 大小:988.07KB
下载 相关 举报
跟我一起写Makefile可以注释版资料下载.pdf_第1页
第1页 / 共78页
跟我一起写Makefile可以注释版资料下载.pdf_第2页
第2页 / 共78页
跟我一起写Makefile可以注释版资料下载.pdf_第3页
第3页 / 共78页
跟我一起写Makefile可以注释版资料下载.pdf_第4页
第4页 / 共78页
跟我一起写Makefile可以注释版资料下载.pdf_第5页
第5页 / 共78页
点击查看更多>>
下载资源
资源描述

跟我一起写Makefile可以注释版资料下载.pdf

《跟我一起写Makefile可以注释版资料下载.pdf》由会员分享,可在线阅读,更多相关《跟我一起写Makefile可以注释版资料下载.pdf(78页珍藏版)》请在冰豆网上搜索。

跟我一起写Makefile可以注释版资料下载.pdf

.131、显式规则。

.142、隐晦规则。

.143、变量的定义。

.144、文件指示。

.145、注释。

.14二、Makefile的文件名.15三、引用其它的Makefile.15四、环境变量MAKEFILES.16五、make的工作方式.16第五部分、书写规则.17一、规则举例.17二、规则的语法.17三、在规则中使用通配符.18四、文件搜寻.19五、伪目标.20六、多目标.22七、静态模式.22八、自动生成依赖性.24第六部分书写命令.25一、显示命令.26二、命令执行.26三、命令出错.27四、嵌套执行make.28五、定义命令包.30第七部分使用变量.30一、变量的基础.31二、变量中的变量.32三、变量高级用法.34四、追加变量值.37五、override指示符.37六、多行变量.38第2页共78页2005年10月14日整理:

陈皓七、环境变量.38八、目标变量.39九、模式变量.40第八部分使用条件判断.40一、示例.40二、语法.42第九部分使用函数.43一、函数的调用语法.44二、字符串处理函数.441、subst.442、patsubst.453、strip.454、findstring.465、filter.466、filter-out.467、sort.478、word.479、wordlist.4710、words.4711、firstword.4812、字符串函数实例.48三、文件名操作函数.481、dir.482、notdir.483、suffix.494、basename.495、addsuffix.496、addprefix.497、join.50四、foreach函数.50五、if函数.50六、call函数.51七、origin函数.51“undefined”.52“default”.52“file”.52“commandline”.52“override”.52“automatic”.52八、shell函数.53九、控制make的函数.531、error.532、warning.54第十部分make的运行.54第3页共78页2005年10月14日整理:

陈皓一、make的退出码.54二、指定Makefile.54三、指定目标.55“all”.56“clean”.56“install”.56“print”.56“tar”.56“dist”.56“TAGS”.56“check”和“test”.56四、检查规则.57五、make的参数.57第十一部分隐含规则.61一、使用隐含规则.61二、隐含规则一览.621、编译C程序的隐含规则.632、编译C+程序的隐含规则.633、编译Pascal程序的隐含规则.634、编译Fortran/Ratfor程序的隐含规则.635、预处理Fortran/Ratfor程序的隐含规则.636、编译Modula-2程序的隐含规则.637、汇编和汇编预处理的隐含规则.648、链接Object文件的隐含规则.649、YaccC程序时的隐含规则.6410、LexC程序时的隐含规则.6411、LexRatfor程序时的隐含规则.6512、从C程序、Yacc文件或Lex文件创建Lint库的隐含规则.65三、隐含规则使用的变量.651、关于命令的变量。

.652、关于命令参数的变量.66四、隐含规则链.67五、定义模式规则.681、模式规则介绍.682、模式规则示例.693、自动化变量.704、模式的匹配.725、重载内建隐含规则.72六、老式风格的后缀规则.73七、隐含规则搜索算法.74第十二部分使用make更新函数库文件.75一、函数库文件的成员.75二、函数库成员的隐含规则.75三、函数库文件的后缀规则.76第4页共78页2005年10月14日整理:

陈皓四、注意事项.76第十三部分后序.77第5页共78页2005年10月14日整理:

陈皓第一部分、概述第一部分、概述什么是makefile?

或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makefile还是要懂。

这就好像现在有这么多的HTML的编辑器,但如果你想成为一个专业人士,你还是要了解HTML的标识的含义。

特别在Unix下的软件编译,你就不能不自己写makefile了,会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力。

因为,makefile关系到了整个工程的编译规则。

一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。

makefile带来的好处就是“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。

make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:

Delphi的make,VisualC+的nmake,Linux下GNU的make。

可见,makefile都成为了一种在工程方面的编译方法。

现在讲述如何写makefile的文章比较少,这是我想写这篇文章的原因。

当然,不同产商的make各不相同,也有不同的语法,但其本质都是在“文件依赖性”上做文章,这里,我仅对GNU的make进行讲述,我的环境是RedHatLinux8.0,make的版本是3.80。

必竟,这个make是应用最为广泛的,也是用得最多的。

而且其还是最遵循于IEEE1003.2-1992标准的(POSIX.2)。

在这篇文档中,将以C/C+的源码作为我们基础,所以必然涉及一些关于C/C+的编译的知识,相关于这方面的内容,还请各位查看相关的编译器的文档。

这里所默认的编译器是UNIX下的GCC和CC。

第二部分、关于程序的编译和链接第二部分、关于程序的编译和链接在此,我想多说关于程序编译的一些规范和方法,一般来说,无论是C、C+、还是pas,首先要把源文件编译成中间代码文件,在Windows下也就是.obj文件,UNIX下是.o文件,即ObjectFile,这个动作叫做编译(compile)。

然后再把大量的ObjectFile合成执行文件,这个动作叫作链接(link)。

编译时,编译器需要的是语法的正确,函数与变量的声明的正确。

对于后者,通常是你需要告诉编译器头文件的所在位置(头文件中应该只是声明,而定义应该放在C/C+文件中),只要所有的语法正确,编译器就可以编译出中间目标文件。

一般来说,每个源文件都应该对应于一个中间目标文件(O文件或是OBJ文件)。

链接时,主要是链接函数和全局变量,所以,我们可以使用这些中间目标文件(O文件或是OBJ文件)来链接我们的应用程序。

链接器并不管函数所在的源文件,只管函数的中间目标文件(ObjectFile),在大多数时候,由于源文件太多,编译生成的中间目标文件太多,而在链第6页共78页2005年10月14日整理:

陈皓接时需要明显地指出中间目标文件名,这对于编译很不方便,所以,我们要给中间目标文件打个包,在Windows下这种包叫“库文件”(LibraryFile),也就是.lib文件,在UNIX下,是ArchiveFile,也就是.a文件。

总结一下,源文件首先会生成中间目标文件,再由中间目标文件生成执行文件。

在编译时,编译器只检测程序语法,和函数、变量是否被声明。

如果函数未被声明,编译器会给出一个警告,但可以生成ObjectFile。

而在链接程序时,链接器会在所有的ObjectFile中找寻函数的实现,如果找不到,那到就会报链接错误码(LinkerError),在VC下,这种错误一般是:

Link2001错误,意思说是说,链接器未能找到函数的实现。

你需要指定函数的ObjectFile.好,言归正传,GNU的make有许多的内容,闲言少叙,还是让我们开始吧。

第三部分、第三部分、Makefile介绍介绍make命令执行时,需要一个Makefile文件,以告诉make命令需要怎么样的去编译和链接程序。

首先,我们用一个示例来说明Makefile的书写规则。

以便给大家一个感兴认识。

这个示例来源于GNU的make使用手册,在这个示例中,我们的工程有8个C文件,和3个头文件,我们要写一个Makefile来告诉make命令如何编译和链接这几个文件。

我们的规则是:

1)如果这个工程没有编译过,那么我们的所有C文件都要编译并被链接。

2)如果这个工程的某几个C文件被修改,那么我们只编译被修改的C文件,并链接目标程。

3)如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的C文件,并链接目标程序。

只要我们的Makefile写得够好,所有的这一切,我们只用一个make命令就可以完成,make命令会自动智能地根据当前的文件修改的情况来确定哪些文件需要重编译,从而自己编译所需要的文件和链接目标程序。

一、一、Makefile的规则的规则在讲述这个Makefile之前,还是让我们先来粗略地看一看Makefile的规则。

target.:

mand第7页共78页2005年10月14日整理:

陈皓.target也就是一个目标文件,可以是ObjectFile,也可以是执行文件。

还可以是一个标签(Label),对于标签这种特性,在后续的“伪目标”章节中会有叙述。

prerequisites就是,要生成那个target所需要的文件或是目标。

command也就是make需要执行的命令。

(任意的Shell命令)这是一个文件的依赖关系,也就是说,target这一个或多个的目标文件依赖于prerequisites中的文件,其生成规则定义在command中。

说白一点就是说,prerequisites中如果有一个以上的文件比target文件要新的话,command所定义的命令就会被执行。

这就是Makefile的规则。

也就是Makefile中最核心的内容。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试认证 > IT认证

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1