`
dreamstone
  • 浏览: 289113 次
  • 来自: ...
文章分类
社区版块
存档分类

(转)跟我一起学make十四

阅读更多

使用make更新函数库文件
———————————

函数库文件也就是对Object文件(程序编译的中间文件)的打包文件。在Unix下,一般是由命令"ar"来完成打包工作。

一、函数库文件的成员

一个函数库文件由多个文件组成。你可以以如下格式指定函数库文件及其组成:

    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时有一些更为绝妙的方法,请记得告诉我啊。

 
分享到:
评论

相关推荐

    跟我一起学Makefile.pdf

    跟我一起学Makefile.pdf Makefile是嵌入式工程师开发必备的经典教程,以下是从文件中提取的相关知识点: 1. 关于程序的编译和链接:Makefile的主要作用是自动化编译和链接过程,使得开发者可以更方便地管理项目。 ...

    跟我一起学Makefile

    《跟我一起学Makefile》是针对Linux环境下的Makefile编写技术进行深入讲解的资源集合,旨在帮助初学者和开发者快速理解和掌握Makefile的编写规则与技巧。Makefile在软件开发中扮演着重要的角色,它是自动化构建工具...

    跟我一起学Makefile(PDF版)

    《跟我一起学Makefile》是由陈皓撰写,祝冬华整理的一本关于Makefile学习的PDF教程。Makefile是软件构建过程中的重要工具,尤其在C、C++等编程语言中,它能自动化编译、链接等步骤,提高开发效率。这本书主要针对想...

    跟我一起学makefile

    《跟我一起学makefile》这本书为我们提供了一个深入理解并掌握makefile的绝佳平台。makefile是构建自动化工具,主要用于管理程序编译过程,它能够帮助程序员高效地组织和执行编译任务,尤其在大型项目中,其价值...

    跟我一起学写makefile

    用 make 来开发和编译程式的确很方便,可是要写出一个 Makefile 就不简单了。偏偏介绍 Makefile 的文件不多,GNU Make 那份印出来要几 百页的文件,光看完 Overview 就快阵亡了,难怪许多人闻 Unix 色变。 本文将...

    跟我一起学MAKEFILE

    《跟我一起学MAKEFILE》这份经典文档是专为想要深入理解和掌握MAKEFILE的读者精心编写的。MAKEFILE在软件开发中扮演着至关重要的角色,它是一个自动化构建工具,能够简化编译、链接等过程,提高开发效率。通过阅读这...

    跟我一起写Makefile.pdf

    《跟我一起写Makefile》是陈皓大佬撰写的一份PDF文档,主要讲解了如何编写和理解Makefile,以便于管理程序的编译和链接过程。Makefile是软件开发中的一个重要工具,它帮助自动化构建过程,使得编译和链接更加高效。 ...

    跟我一起学Makefile.doc

    【跟我一起学Makefile】 Makefile是软件构建过程中的核心文件,它定义了项目中各个文件之间的依赖关系以及编译和链接的规则。在Windows环境下,许多集成开发环境(IDE)如Visual Studio会自动处理这些任务,但在...

    跟我一起学makefile.zip

    《跟我一起学Makefile》教程是一本专注于讲解Makefile这一构建工具的详尽指南。Makefile在软件开发中起着至关重要的作用,它自动化了编译、链接等过程,极大地提高了开发效率。在这个教程中,我们将深入理解Makefile...

    跟我一起学makefile.pd

    ### 跟我一起学Makefile #### 第一部分:概述 **Makefile**是一种用于自动化构建过程的脚本文件,在软件开发过程中极为常见。通过定义一系列规则和指令,Makefile可以自动化地完成编译、链接等任务,极大地提高了...

    跟我一起写Makefile (PDF重制版)

    ### 跟我一起写Makefile (PDF重制版) #### 概述 《跟我一起写Makefile (PDF重制版)》是一本详细介绍如何编写Makefile的指南书,适用于希望深入了解并掌握Makefile编写的程序员。Makefile是用于自动化构建过程的一...

Global site tag (gtag.js) - Google Analytics