第八章 开发工具

1.makefile文件用来告诉make命令应用程序的构造。makefile文件由一组依赖关系和规则组成。每个依赖关系由一个目标(将要创建的文件)和一组该目标所依赖的源文件组成。而规则描述了如何通过这些依赖文件来构造目标。一般来说,目标是一个单独的可执行文件。make命令会读取makefile文件的内容,它先确定目标文件,然后比较该目标所依赖的源文件的日期和时间以决定该采用哪条规则来构造目标。make命令会根据makefile文件来确定目标文件的创建顺序以及正确的规则调用顺序。

2.make命令的选项和参数

make程序本身最常用的选项有以下三个:

-k:它的作用是让make命令在发现错误时仍然继续执行,可以利用这个选项在一次操作中发现所有未编译成功的源文件。

-n:它的作用是让make命令输出将要执行的操作步骤,而不是真正执行这些操作。

-f :它的作用是高速make命令将哪个文件作为makefile。

3.依赖关系

在makefile文件中,这些规则的写法是:先写目标的名称,然后紧跟着一个冒号,接着是空格或者制表符tab,最后是用空格或者制表符tab隔开的文件列表*这些文件用于创建目标文件)。

例如:main.o: main.c a.h

4.规则

make命令假设在makefile文件中的第一个目标是想创建的目标文件,然后它会检查其他的依赖关系。makefile文件中的奇怪的语法现象:空格和制表符tab是有区别的。规则所在的行必须以tab开头,用空格是不行的。此外,如果makefile文件中的某行以空格结尾,它可能导致make命令执行失败。

例如:  tcc –o myapp main.o 2.o 3.o

5.makefile中的注释和宏

makefile中的注释以#号开头,一直延续到这一行的结束。

通过MACRONAME=value在makefile文件中定义宏,引用宏的方法是使用$(MACRONAME)或${MACRONAME},如果想把一个宏的值设置为空,你可以在等号后面留空。

当在makefile文件之外使用宏定义时,要注意宏定义必须以单个参数的形式传递,所以应避免在宏定义中使用空格或者应该像下面这种方式给宏定义加上引号:

make “CC = c89”

make命令内置了一些特殊的宏定义,这些宏在使用前才展开,所以它们的含义会随着makefile文件的处理进展而发生变化。

$?:当前目标所依赖的文件列表中比当前目标文件还要新的文件

$@:当前目标的名字

$<:当前依赖文件的名字

#*:不包括后缀名的当前依赖文件的名字

在makefile文件中,你可能还会看到下面两个有用的特殊字符,它们出现在命令之前

-:告诉make命令忽略所有错误。

@:告诉make在执行某条命令前不要将该命令显示在标准输出上。如果想用echo命令给出一些说明信息,该字符非常有用。

6.多个目标

目标clean用rm命令来删除目标文件。rm命令以-开头,含义是让make命令忽略rm命令的执行结果。用于制作目标clean的规则并未给目标clean定义任何依赖关系,行clean:后面是空的,因此该目标总是被认为是过时的,所以在执行make命令时,该目标所对应的规则总是会被执行。

由于make命令在执行规则时会调用一个shell,并且会针对每个规则使用一个新shell,所以必须在上面每行代码的结尾加上一个反斜杠\,让所有shell脚本命令在逻辑上处于同一行(使用到shell编程语句的时候),并作为一个整体传递给一个shell执行。

7.内置规则

考虑到存在许多内置规则,可以将文件makefile中用于制作目标的规则去掉,而只需指定依赖关系,从而达到简化makefile的目的。通常内置规则都利用了文件的后缀名,最常见的一条规则是用于从一个.c为后缀名的文件创建出一个以.o为后缀名的文件。

要想增加一条新的后缀规则,首先需要在makefile文件中增加一行语句,告诉make命令这个新的后缀名。然后即可用这个新的后缀名来定义规则。make使用特殊语法:

..:

来定义一条通用规则,利用该规则可以从带有旧后缀名的文件创建带有新后缀名的文件,并保留原文件的前半部分。示例:

.SUFFIXES:   .cpp

.cpp.o:

    $(cc)–xc++ $(CFLAGS) –I$(INCLUDE) –c$<</P>

解析:-xc++标志的作用是高速gcc编译器这是一个C++源文件。特殊依赖关系.cpp.o:告诉make,紧随其后的规则是用于将后缀名为.cpp的文件转换为后缀名为.o的文件。

最新的make版本还包含一个新的语法以实现同样的效果,而且功能更强大。例如,模式规则可以用%通配符语法来匹配文件名,而不是仅依赖于文件的后缀名。示例:

%.cpp:%o

    $(cc)–xc++ $(CFLAGS) –I$(INCLUDE) –c$<</P>

8.用make管理函数库

对于大项目来说,一种比较方便的做法是用函数库来管理多个编译产品。函数库实际上就是文件,通上以.a为后缀,在该文件中包含了一组目标文件。用于管理函数库的语法是lib(file.o),它的含义是目标文件file.o是存储在函数库lib.a中的。make命令用一个内置规则来管理函数库,该规则的常见形式如下所示:

.c.a:

    $(CC) –c$(CFLAGS) $<</P>

    $(AR)$(ARFLAGS) $@ $*.o

宏$(AR)和$(ARFLAGS)的默认取值通常分别是命令ar和选项rv。这个相当简洁的语法高速make,要想从.c文件得到.a库文件,它必须应用到上面的两条规则。

第一条规则告诉它必须编译源文件以生成目标文件。

第二条规则告诉它用ar命令将新的目标文件添加到函数库中。

因此,如果有一个名为fud的函数库,其中包含目标文件bas.o,则第一条规则中的$<将被替换为bas.c,而第二条规则中的$@和$*将分别被替换为库文件fud.a和名字bas。

9.高级主题:makefile文件和子目录

对于大型的项目,有时我们希望能够把构成一个函数库的几个文件从主文件中分离出来,并将它们保存到一个子目录中。使用make命令完成这项工作的方法有两个。

(1)第一个方法是,你可以在子目录中编写出第二个makefile文件,它的作用是编译该子目录下的源文件,并将它们保存到一个函数库中,然后将该库文件复制到上一级的主目录中。在主目录的makefile文件包含一条用于制作函数库的规则,该规则会调用第二个makefile文件,如下所示:

mylib.a:

    (cdmylibdirectory;$(MAKE))

这就是说,你必须总是执行命令makemylib.a。当make命令调用这条规则来创建函数库时,它将切换到子目录mylibdirectory中,然后调用一个新的make命令来管理函数库。由于make会针对每个命令调用一个新的shell,而使用第二个makefile文件的make命令本身又没有执行cd命令,但它又必须在一个不同的目录下创建函数库,为了解决这一问题,我们用括号括起来,从而确保它们只被一个单独的shell处理。

(2)第二个方法是,在原来的makefile文件中添加一些宏。新添加的宏通过在一个宏的尾部追加一个字母得到,字母D代表目录,字母F代表文件名。然后就可以用下面的规则来替换内置的.c.o后缀规则:

.c.o:

    $(CC)$(CFLAGS) –c $(@D)/$(

这条规则的作用是:编译子目录中的源文件并将目标文件放在该子目录中。然后,用如下的依赖关系和规则来更新当前目录下的函数库:

mylib.a: mydir/2.o mydir/3.o

    ar –rvmylib.a $?

10.GNU的make命令和GNU的gcc编译器有下面两个有趣的选项。

第一个选项是make命令的-jN选项,它允许make命令同时执行N条命令。如果项目的不同部分可以彼此独立地进行编译,make命令就可以同时调用几条规则。

第二个选项是gcc的-MM选项,它的作用是产生一个适用于make命令的依赖关系清单。如果某个项目包含非常多的源文件,每个源文件又包含不同的头文件的组合,则理清它们之间的依赖关系将会变得非常困难。如果让每个源文件都依赖于所有的头文件,有时候就会编译一些没有必要编译的文件。

11.tar命令

tar命名的基本语法:

tar [options] [list of fiels]

选项参数:

c:创建新文档文件

f:指定目标为一个文件而不是一个设备

t:列出档案文件的内容,但并不真正释放它们

v:显示tar命令执行的详细过程

x:从档案文件中释放文件

z:在GNU版本的tar命令中用gzip命令压缩档案文件

12.RPM软件包管理程序

每个RPM软件包都存储在一个以.rpm为后缀的文件中。软件包文件通常遵循着一种命名规范,它的结构如下所示:

name-version-release.architecture.rpm

name指定该软件包的通用名称,version指定该软件的版本号,release包含一个数字,它指定软件包RPM版本号。这个版本号非常重要,因为RPM软件包是通过一组指令建立的。architecture指定程序的架构。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值