- 浏览: 5173080 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
silence19841230:
先拿走看看
SpringBoot2.0开发WebSocket应用完整示例 -
wallimn:
masuweng 写道发下源码下载地址吧!三个相关文件打了个包 ...
SpringBoot2.0开发WebSocket应用完整示例 -
masuweng:
发下源码下载地址吧!
SpringBoot2.0开发WebSocket应用完整示例 -
masuweng:
SpringBoot2.0开发WebSocket应用完整示例 -
wallimn:
水淼火 写道你好,我使用以后,图标不显示,应该怎么引用呢,谢谢 ...
前端框架iviewui使用示例之菜单+多Tab页布局
一、函数库文件的成员
一个函数库文件由多个文件组成。你可以以如下格式指定函数库文件及其组成:
archive(member)
这个不是一个命令,而一个目标和依赖的定义。一般来说,这种用法基本上就是为了”ar”命令来服务的。如:
foolib(hack.o) : hack.o
ar cr foolib hack.o
如果要指定多个member,那就以空格分开,如:
foolib(hack.o kludge.o)
其等价于:
foolib(hack.o) foolib(kludge.o)
你还可以使用Shell的文件通配符来定义,如:
foolib(*.o)
二、函数库成员的隐含规则
当make搜索一个目标的隐含规则时,一个特殊的特性是,如果这个目标是”a(m)”形式的,其会把目标变成”(m)”。于是,如果我们的成员是”%. o”的模式定义,并且如果我们使用”make foo.a(bar.o)”的形式调用Makefile时,隐含规则会去找”bar.o”的规则,如果没有定义bar.o的规则,那么内建隐含规则生效, make会去找bar.c文件来生成bar.o,如果找得到的话,make执行的命令大致如下:
cc -c bar.c -o bar.o
ar r foo.a bar.o
rm -f bar.o
还有一个变量要注意的是”$%”,这是专属函数库文件的自动化变量,有关其说明请参见”自动化变量”一节。
三、函数库文件的后缀规则
你可以使用”后缀规则”和”隐含规则”来生成函数库打包文件,如:
.c.a:
$(CC) $(CFLAGS) $(CPPFLAGS) -c $< -o $*.o
$(AR) r $@ $*.o
$(RM) $*.o
其等效于:
(%.o) : %.c
$(CC) $(CFLAGS) $(CPPFLAGS) -c $< -o $*.o
$(AR) r $@ $*.o
$(RM) $*.o
四、注意事项
在进行函数库打包文件生成时,请小心使用make的并行机制(”-j”参数)。如果多个ar命令在同一时间运行在同一个函数库打包文件上,就很有可以损坏这个函数库文件。所以,在make未来的版本中,应该提供一种机制来避免并行操作发生在函数打包文件上。
但就目前而言,你还是应该不要尽量不要使用”-j”参数。
后序
——
终于到写结束语的时候了,以上基本上就是GNU make的Makefile的所有细节了。其它的产商的make基本上也就是这样的,无论什么样的make,都是以文件的依赖性为基础的,其基本是都是遵 循一个标准的。这篇文档中80%的技术细节都适用于任何的make,我猜测”函数”那一章的内容可能不是其它make所支持的,而隐含规则方面,我想不同 的make会有不同的实现,我没有精力来查看GNU的make和VC的nmake、BCB的make,或是别的UNIX下的make有些什么样的差别,一 是时间精力不够,二是因为我基本上都是在Unix下使用make,以前在SCO Unix和IBM的AIX,现在在Linux、Solaris、HP-UX、AIX和Alpha下使用,Linux和Solaris下更多一点。不过,我 可以肯定的是,在Unix下的make,无论是哪种平台,几乎都使用了Richard Stallman开发的make和cc/gcc的编译器,而且,基本上都是GNU的make(公司里所有的UNIX机器上都被装上了GNU的东西,所以, 使用GNU的程序也就多了一些)。GNU的东西还是很不错的,特别是使用得深了以后,越来越觉得GNU的软件的强大,也越来越觉得GNU的在操作系统中 (主要是Unix,甚至Windows)”杀伤力”。
对于上述所有的make的细节,我们不但可以利用make这个工具来编译我们的程序,还可以利用make来完成其它的工作,因为规则中的命令可以是任何 Shell之下的命令,所以,在Unix下,你不一定只是使用程序语言的编译器,你还可以在Makefile中书写其它的命令,如:tar、awk、 mail、sed、cvs、compress、ls、rm、yacc、rpm、ftp……等等,等等,来完成诸如”程序打包”、”程序备份”、”制作程序 安装包”、”提交代码”、”使用程序模板”、”合并文件”等等五花八门的功能,文件操作,文件管理,编程开发设计,或是其它一些异想天开的东西。比如,以 前在书写银行交易程序时,由于银行的交易程序基本一样,就见到有人书写了一些交易的通用程序模板,在该模板中把一些网络通讯、数据库操作的、业务操作共性 的东西写在一个文件中,在这些文件中用些诸如”@@@N、###N”奇怪字串标注一些位置,然后书写交易时,只需按照一种特定的规则书写特定的处理,最后 在make时,使用awk和sed,把模板中的”@@@N、###N”等字串替代成特定的程序,形成C文件,然后再编译。这个动作很像数据库的”扩展C” 语言(即在C语言中用”EXEC SQL”的样子执行SQL语句,在用cc/gcc编译之前,需要使用”扩展C”的翻译程序,如cpre,把其翻译成标准 C)。如果你在使用make时有一些更为绝妙的方法,请记得告诉我啊。
回头看看整篇文档,不觉记起几年前刚刚开始在Unix下做开发的时候,有人问我会不会写Makefile时,我两眼发直,根本不知道在说什么。一开始看到 别人在vi中写完程序后输入”!make”时,还以为是vi的功能,后来才知道有一个Makefile在作怪,于是上网查啊查,那时又不愿意看英文,发现 就根本没有中文的文档介绍Makefile,只得看别人写的Makefile,自己瞎碰瞎搞才积累了一点知识,但在很多地方完全是知其然不知所以然。后来 开始从事UNIX下产品软件的开发,看到一个400人年,近200万行代码的大工程,发现要编译这样一个庞然大物,如果没有Makefile,那会是多么 恐怖的一样事啊。于是横下心来,狠命地读了一堆英文文档,才觉得对其掌握了。但发现目前网上对Makefile介绍的文章还是少得那么的可怜,所以想写这 样一篇文章,共享给大家,希望能对各位有所帮助。
现在我终于写完了,看了看文件的创建时间,这篇技术文档也写了两个多月了。发现,自己知道是一回事,要写下来,跟别人讲述又是另外一回事,而且,现在越来 越没有时间专研技术细节,所以在写作时,发现在阐述一些细节问题时很难做到严谨和精练,而且对先讲什么后讲什么不是很清楚,所以,还是参考了一些国外站点 上的资料和题纲,以及一些技术书籍的语言风格,才得以完成。整篇文档的提纲是基于GNU的Makefile技术手册的提纲来书写的,并结合了自己的工作经 验,以及自己的学习历程。因为从来没有写过这么长,这么细的文档,所以一定会有很多地方存在表达问题,语言歧义或是错误。因些,我迫切地得等待各位给我指 证和建议,以及任何的反馈。
最后,还是利用这个后序,介绍一下自己。我目前从事于所有Unix平台下的软件研发,主要是做分布式计算/网格计算方面的系统产品软件,并且我对于下一代 的计算机革命——网格计算非常地感兴趣,对于分布式计算、P2P、Web Service、J2EE技术方向也很感兴趣,同时,对于项目实施、团队管理、项目管理也小有心得,希望同样和我战斗在“技术和管理并重”的阵线上的年轻 一代,能够和我多多地交流。我的MSN是:haoel@hotmail.com(常用),QQ是:753640(不常用)。(注:请勿给我MSN的邮箱发 信,由于hotmail的垃圾邮件导致我拒收这个邮箱的所有来信)
我欢迎任何形式的交流,无论是讨论技术还是管理,或是其它海阔天空的东西。除了政治和娱乐新闻我不关心,其它只要积极向上的东西我都欢迎!
最最后,我还想介绍一下make程序的设计开发者。
首当其冲的是: Richard Stallman
开源软件的领袖和先驱,从来没有领过一天工资,从来没有使用过Windows操作系统。对于他的事迹和他的软件以及他的思想,我无需说过多的话,相信大家 对这个人并不比我陌生,这是他的主页:http://www.stallman.org/ 。这里只贴上一张他的近照:
第二位是:Roland McGrath
个人主页是:http://www.frob.com/~roland/ ,下面是他的一些事迹:
1) 合作编写了并维护GNU make。
2) 和Thomas Bushnell一同编写了GNU Hurd。
3) 编写并维护着GNU C library。
4) 合作编写并维护着部分的GNU Emacs。
在此,向这两位开源项目的斗士致以最真切的敬意。
(全文完)
一个函数库文件由多个文件组成。你可以以如下格式指定函数库文件及其组成:
archive(member)
这个不是一个命令,而一个目标和依赖的定义。一般来说,这种用法基本上就是为了”ar”命令来服务的。如:
foolib(hack.o) : hack.o
ar cr foolib hack.o
如果要指定多个member,那就以空格分开,如:
foolib(hack.o kludge.o)
其等价于:
foolib(hack.o) foolib(kludge.o)
你还可以使用Shell的文件通配符来定义,如:
foolib(*.o)
二、函数库成员的隐含规则
当make搜索一个目标的隐含规则时,一个特殊的特性是,如果这个目标是”a(m)”形式的,其会把目标变成”(m)”。于是,如果我们的成员是”%. o”的模式定义,并且如果我们使用”make foo.a(bar.o)”的形式调用Makefile时,隐含规则会去找”bar.o”的规则,如果没有定义bar.o的规则,那么内建隐含规则生效, make会去找bar.c文件来生成bar.o,如果找得到的话,make执行的命令大致如下:
cc -c bar.c -o bar.o
ar r foo.a bar.o
rm -f bar.o
还有一个变量要注意的是”$%”,这是专属函数库文件的自动化变量,有关其说明请参见”自动化变量”一节。
三、函数库文件的后缀规则
你可以使用”后缀规则”和”隐含规则”来生成函数库打包文件,如:
.c.a:
$(CC) $(CFLAGS) $(CPPFLAGS) -c $< -o $*.o
$(AR) r $@ $*.o
$(RM) $*.o
其等效于:
(%.o) : %.c
$(CC) $(CFLAGS) $(CPPFLAGS) -c $< -o $*.o
$(AR) r $@ $*.o
$(RM) $*.o
四、注意事项
在进行函数库打包文件生成时,请小心使用make的并行机制(”-j”参数)。如果多个ar命令在同一时间运行在同一个函数库打包文件上,就很有可以损坏这个函数库文件。所以,在make未来的版本中,应该提供一种机制来避免并行操作发生在函数打包文件上。
但就目前而言,你还是应该不要尽量不要使用”-j”参数。
后序
——
终于到写结束语的时候了,以上基本上就是GNU make的Makefile的所有细节了。其它的产商的make基本上也就是这样的,无论什么样的make,都是以文件的依赖性为基础的,其基本是都是遵 循一个标准的。这篇文档中80%的技术细节都适用于任何的make,我猜测”函数”那一章的内容可能不是其它make所支持的,而隐含规则方面,我想不同 的make会有不同的实现,我没有精力来查看GNU的make和VC的nmake、BCB的make,或是别的UNIX下的make有些什么样的差别,一 是时间精力不够,二是因为我基本上都是在Unix下使用make,以前在SCO Unix和IBM的AIX,现在在Linux、Solaris、HP-UX、AIX和Alpha下使用,Linux和Solaris下更多一点。不过,我 可以肯定的是,在Unix下的make,无论是哪种平台,几乎都使用了Richard Stallman开发的make和cc/gcc的编译器,而且,基本上都是GNU的make(公司里所有的UNIX机器上都被装上了GNU的东西,所以, 使用GNU的程序也就多了一些)。GNU的东西还是很不错的,特别是使用得深了以后,越来越觉得GNU的软件的强大,也越来越觉得GNU的在操作系统中 (主要是Unix,甚至Windows)”杀伤力”。
对于上述所有的make的细节,我们不但可以利用make这个工具来编译我们的程序,还可以利用make来完成其它的工作,因为规则中的命令可以是任何 Shell之下的命令,所以,在Unix下,你不一定只是使用程序语言的编译器,你还可以在Makefile中书写其它的命令,如:tar、awk、 mail、sed、cvs、compress、ls、rm、yacc、rpm、ftp……等等,等等,来完成诸如”程序打包”、”程序备份”、”制作程序 安装包”、”提交代码”、”使用程序模板”、”合并文件”等等五花八门的功能,文件操作,文件管理,编程开发设计,或是其它一些异想天开的东西。比如,以 前在书写银行交易程序时,由于银行的交易程序基本一样,就见到有人书写了一些交易的通用程序模板,在该模板中把一些网络通讯、数据库操作的、业务操作共性 的东西写在一个文件中,在这些文件中用些诸如”@@@N、###N”奇怪字串标注一些位置,然后书写交易时,只需按照一种特定的规则书写特定的处理,最后 在make时,使用awk和sed,把模板中的”@@@N、###N”等字串替代成特定的程序,形成C文件,然后再编译。这个动作很像数据库的”扩展C” 语言(即在C语言中用”EXEC SQL”的样子执行SQL语句,在用cc/gcc编译之前,需要使用”扩展C”的翻译程序,如cpre,把其翻译成标准 C)。如果你在使用make时有一些更为绝妙的方法,请记得告诉我啊。
回头看看整篇文档,不觉记起几年前刚刚开始在Unix下做开发的时候,有人问我会不会写Makefile时,我两眼发直,根本不知道在说什么。一开始看到 别人在vi中写完程序后输入”!make”时,还以为是vi的功能,后来才知道有一个Makefile在作怪,于是上网查啊查,那时又不愿意看英文,发现 就根本没有中文的文档介绍Makefile,只得看别人写的Makefile,自己瞎碰瞎搞才积累了一点知识,但在很多地方完全是知其然不知所以然。后来 开始从事UNIX下产品软件的开发,看到一个400人年,近200万行代码的大工程,发现要编译这样一个庞然大物,如果没有Makefile,那会是多么 恐怖的一样事啊。于是横下心来,狠命地读了一堆英文文档,才觉得对其掌握了。但发现目前网上对Makefile介绍的文章还是少得那么的可怜,所以想写这 样一篇文章,共享给大家,希望能对各位有所帮助。
现在我终于写完了,看了看文件的创建时间,这篇技术文档也写了两个多月了。发现,自己知道是一回事,要写下来,跟别人讲述又是另外一回事,而且,现在越来 越没有时间专研技术细节,所以在写作时,发现在阐述一些细节问题时很难做到严谨和精练,而且对先讲什么后讲什么不是很清楚,所以,还是参考了一些国外站点 上的资料和题纲,以及一些技术书籍的语言风格,才得以完成。整篇文档的提纲是基于GNU的Makefile技术手册的提纲来书写的,并结合了自己的工作经 验,以及自己的学习历程。因为从来没有写过这么长,这么细的文档,所以一定会有很多地方存在表达问题,语言歧义或是错误。因些,我迫切地得等待各位给我指 证和建议,以及任何的反馈。
最后,还是利用这个后序,介绍一下自己。我目前从事于所有Unix平台下的软件研发,主要是做分布式计算/网格计算方面的系统产品软件,并且我对于下一代 的计算机革命——网格计算非常地感兴趣,对于分布式计算、P2P、Web Service、J2EE技术方向也很感兴趣,同时,对于项目实施、团队管理、项目管理也小有心得,希望同样和我战斗在“技术和管理并重”的阵线上的年轻 一代,能够和我多多地交流。我的MSN是:haoel@hotmail.com(常用),QQ是:753640(不常用)。(注:请勿给我MSN的邮箱发 信,由于hotmail的垃圾邮件导致我拒收这个邮箱的所有来信)
我欢迎任何形式的交流,无论是讨论技术还是管理,或是其它海阔天空的东西。除了政治和娱乐新闻我不关心,其它只要积极向上的东西我都欢迎!
最最后,我还想介绍一下make程序的设计开发者。
首当其冲的是: Richard Stallman
开源软件的领袖和先驱,从来没有领过一天工资,从来没有使用过Windows操作系统。对于他的事迹和他的软件以及他的思想,我无需说过多的话,相信大家 对这个人并不比我陌生,这是他的主页:http://www.stallman.org/ 。这里只贴上一张他的近照:
第二位是:Roland McGrath
个人主页是:http://www.frob.com/~roland/ ,下面是他的一些事迹:
1) 合作编写了并维护GNU make。
2) 和Thomas Bushnell一同编写了GNU Hurd。
3) 编写并维护着GNU C library。
4) 合作编写并维护着部分的GNU Emacs。
在此,向这两位开源项目的斗士致以最真切的敬意。
(全文完)
发表评论
-
Delphi中编程实现TWebBrowser查找及上一个、下一个功能
2016-08-18 13:58 1361代码比较简单,全部内容如下: //1:向下搜索;-1:向上 ... -
OLEDB的Excel的IMEX和HDR是什么意思
2013-11-23 21:15 2129转自:http://blog.csdn.net/baple/a ... -
c#获取应用程序目录
2013-10-23 22:35 1732string str1 =Process.GetCurrent ... -
Visual C# 方案 -> 文本操作快捷键
2013-10-07 22:34 2064转自:http://technet.microsoft.com ... -
Visual Studio 2005快捷键大全
2013-10-07 22:29 1647转自:http://www.cnblogs.com/mekon ... -
C#正则表达式测试小工具
2013-10-04 18:51 4786C#的正则表达式使用比较方便,但复杂的正则表达式还是需要测 ... -
C#正则表达式语法规则详解
2013-10-04 17:26 4053正则表达式通常包含字 ... -
C# WINFORM 捕获全局异常
2013-10-01 11:56 3043using System; using System.Coll ... -
Visual C# 中XML注释的使用(含注释在开发时显示换行)
2013-10-01 11:54 2469在C#智能注释时,常常希望它能在开发时显示为换行,使得提示更加 ... -
DevExpress汉化(WinForm)
2013-09-19 17:27 8308/* *隔壁老王原创,2013-09-21,转载请保留本人信息 ... -
VC中的CImage类
2011-04-17 22:19 8963今天查找如何实现 ... -
VC旋转图片
2011-04-16 16:45 3778转自:http://hi.baidu.com/sweetpig ... -
VC多线程编程(转)
2010-12-22 21:11 3210原文地址:http://www.cnblo ... -
Manifest的问题
2010-05-11 10:08 2308原始连接:http://www.zming ... -
Asp.Net中Word,Excel等office com组件操作权限的问题
2010-05-06 13:57 10211近日在打开原来写的一 ... -
如何注销windows server2003 服务器中的远程连接
2009-12-14 01:29 3813碰到超过远程连接数而无法连接服务器,可以采用如下方法解决 ... -
访问WebBrowser控件中的HTML源码
2009-12-11 22:13 4125为了实现在自己的程序中显示HTML文档,我们一般采用IE(In ... -
Makefile详解(2/3)
2009-12-01 12:29 2227八、目标变量 前面我们所讲的在Makefile中定义的变量都 ... -
Makefile详解(1/3)
2009-12-01 12:27 2212原文地址:http://blog.csdn ... -
OLE DB 的概念
2009-11-20 22:41 2115简单地说,OLE DB 是 ...
相关推荐
这个压缩包包含了“Makefile详解.pdf”和“GNU_Make_3.80_cn.pdf”两份文档,旨在帮助用户深入理解Makefile的原理和使用方法。 首先,让我们详细了解Makefile的核心概念。Makefile是一个文本文件,其中包含了规则...
### Makefile详解 #### 一、Makefile概览与重要性 Makefile 是一种用于自动化构建过程的脚本文件,在 Linux 和 Unix 环境中非常常见。它可以帮助开发者高效管理项目的编译流程,尤其在处理大型项目时,能够极大地...
### U-Boot 1.1.6顶层Makefile详解 U-Boot(Universal Boot Loader)是一种广泛应用于嵌入式系统的启动加载程序。它支持多种处理器架构,并具备丰富的功能特性,如网络启动、串口控制台等。对于U-Boot源码的理解与...
Makefile是Unix/Linux系统中用于控制软件编译过程的脚本文件,它记录了项目中源文件之间的依赖关系,并规定了如何进行编译和链接,以生成可执行文件。Makefile广泛应用于C和C++的项目中,因为它可以大大简化编译过程...
### makefile详解 #### 一、makefile的重要性与作用 在软件开发过程中,makefile扮演着极其重要的角色,尤其在大型项目的构建管理方面。对于Windows程序员来说,由于集成开发环境(IDE)通常提供了完整的项目管理和...
### Linux/Unix环境下的Make和Makefile详解 #### 一、Make工具简介 在Linux或Unix环境下,Make是一个极其重要的工具,广泛应用于项目开发和软件安装过程中。它可以帮助开发者高效地管理和编译复杂的项目,尤其是当...
### Make和Makefile详解 #### 一、Make和Makefile概览 **Make** 是一个命令行工具,用于处理 **Makefile** 文件中定义的任务。Makefile 是一种文本文件,其中包含了编译程序所需的指令集,它告诉 make 如何构建...
Makefile详解——从入门到精通 Makefile是软件构建过程中的一个重要工具,它定义了项目的构建规则、目标和依赖关系,使得编译和链接过程能够自动化进行。掌握Makefile的编写和使用对于任何编程人员,尤其是嵌入式...
### U-Boot中Makefile详解 #### 一、引言 U-Boot(Universal Boot Loader)是一个开源项目,用于各种嵌入式系统平台上的启动加载程序。它支持多种处理器架构,如ARM、PowerPC等,并且能够适应各种硬件平台的需求。...
Linux 内核 Makefile 详解 Linux 内核 Makefile 是 Linux 内核编译过程中的核心组件,它负责将源代码编译成可执行文件。了解 Linux 内核 Makefile 对于开发设备驱动、理解内核代码结构都是非常重要的。 目录 1. ...
3. **编译目标**:kbuild支持多种目标,如编译内核、编译模块、生成内核映像等。通过设置不同的变量和规则,可以控制这些目标的生成。 4. **配置阶段(config阶段)**:使用`make menuconfig`或`make xconfig`等...
"LINUX2.6内核makefile详解" Linux 2.6 内核 Makefile 详解是 Linux 内核开发中非常重要的一部分。Makefile 是一个脚本文件,用于描述如何编译和构建 Linux 内核。该文件是 Linux 内核开发的核心组件之一,对开发...
Linux&Unix环境下的make和makefile详解 (文章来自cu 原作者xzh2002).doc
Makefile 详解中文版 Makefile 是一种自动构建工具,广泛应用于 Unix 和 Linux 系统中。GNU Make 是一个功能强大且广泛使用的 Make 实现,提供了详细的文档和手册。下面是 Makefile 的详细解释: Make 概述 Make...
Makefile是Unix/Linux环境下自动...通过阅读《Makefile 编写详解.pdf》这份资料,你可以更深入地了解如何编写高效的Makefile,优化你的开发流程。学习并熟练运用Makefile,是成为一名专业IT开发者不可或缺的技能之一。
### makefile详解:掌握自动化构建的关键 在软件开发领域,特别是在Unix系统环境下,makefile扮演着举足轻重的角色。makefile是一种用于自动化构建过程的脚本,它定义了源代码文件之间的依赖关系以及编译规则,使得...
### Makefile详解:静态模式与自动生成依赖性的深入解析 #### 静态模式规则 在Makefile中,**静态模式规则**是一种非常强大的特性,它允许用户通过一种简洁的方式来处理多个目标文件及其依赖关系。这种规则使得...
GNU Make 的主要工作是读进一个文本文件, makefile 。这个文件里主要是有关哪些文件 (‘target’目的文件)是从哪些别的 文件(‘dependencies’依靠文件)中产 生的,用什么命令 来进行 这个产生过程。 gcc/g++...