《beginning linux programming 4th edition》中文翻译(一)

来源:互联网 发布:mac怎么关闭程序 编辑:程序博客网 时间:2024/05/20 02:21

1.  译序 

《beginning linux programming 》是一本讲述Linux应用开发的一本挺不错的参考书,目前已经是第四版(2008),由于工作需用到Linux开发,所以在网上找到该书。但目前并没有发现第四版有中文的翻译。所以本人试着翻译了几章内容,现在贡献出来供大家share。

 

2. 第九章 开发工具(Development Tools)

    本章介绍在Linux环境中开发程序所用到的工具,其中有一些在UNIX系统中也可使用。除了明显必须的编译调试器以外,Linux提供一个工具集,工具集中的每个工具都完成一项工作,这使得开发者能够创新性的将这些工具组合起来完成工作。这也是Linux继承Unix的思想的表现之一。本章将会学习这些工具和使用工具的具体实例,包括以下几方面:

(1)make命令及makefile文件

(2)源代码控制软件RCS和CVS

(3)写Manual说明页

(4)使用patch和tar分发软件

(5)开发环境

 

--------华丽的分隔符-----------

多个源文件的问题

当我们写小型程序时,许多开发者可以在修改代码后简单的重新编译他们的程序。但是,当开发大型项目时,这种方法就显现出来问题了。项目的修改-编译-测试周期变长了。即使是最耐心的开发者也难以忍受修改一个文件就要编译整个工程。

一个更加潜在的困难问题是建立了多个头文件,这些头文件包含在不同的源文件中。假设有a.h, b.h以及c.h三个头文件,有main.c 2.c和3.c三个C的源文件(实际项目中请不要使用这样的命名)。你可能会遇到以下的情景:

 

如果开发者改变了c.h文件,那么main.c以及2.c无需重新编译,这是因为它们都不依赖于c.h。但是3.c因为依靠于c.h所以就需要重新编译。另外,若b.h更改后忘记重新编译2.c文件,那么结果是程序的功能运行不正常。

make工具通过确定文件的更改从而确定有无需要重新编译,所以能解决上述问题。

注:make命令不止用来编译程序,还可以通过输入文件构造输出文件,其他应用包括文档处理(e.g. troff or TeX)。

 

 

----------------------华丽的分割线--------------------------------

make命令以及Makefiles

  虽然make命令有内嵌的智能,但是仍然不能完全编译您的程序。你必须提供一个文件告诉make命令如何构造您的程序。这个文件就成为makefile.

  makefile很多时候都和源代码文件在同一目录里,在任何时候你的电脑上都可以存在多个makefile。实际上,当项目很大时,你可以在项目的不同部分使用不同的makefile。

  make命令与makefile的结合为操作项目提供了强大的工具,不仅能够控制源代码的编译,也能用来写manual说明页以及安装程序到某个目录。

Makefile的语法

  makefile包含依赖关系以及规则关系。依赖关系根据源代码生成目标文件;规则关系描述了如何从依赖的文件建立目标文件。准确的说,target就是一个可执行文件。

  make命令读取makefile,决定如何输出目标文件,然后根据源文件的修改日期决定如何构建目标。通常,先建立中间文件,然后才建立目标文件。make命令使用Makefile决定输出目标文件的次序。

 

make命令的选项参数

make程序本身有些选项,最常用三种是:

1)-k,使make工具发现错误后不是立即停止,而是对错误之后的源代码文件继续编译。可以使用本选项一次性发现错误。  

2)-n,使make工具打印出它要如何编译,但不是真正的编译。

3)-f <filename>,用于指定make工具使用哪个makefile文件。如果不指定此选项,make标准版工具将会首先在当前目录下寻找叫做makefile的文件,若找不到就寻找Makefile文件。但是在大多数Linux系统中使用GNU版的Make工具,make会首先寻找GNUnakefile,然后是makefile,最后是Makefile。习惯上大多数程序员使用Makefile,这使makefile文件在以小写的文件名称按字典排序的目录里排在首位。建议不使用GNUmakefile,因为它只针对GNU版本实现。

 

通过设置参数告知make工具建立一个目标文件,通常是可执行文件。如果不这样做的话,make会建立在makefile文件里的第一个目标。许多程序员指定all为他们makefile的第一个目标,并且将其他的目标文件作为all的依赖文件。这种习惯使得在没指定目标的情况下makefile文件默认构造目标正确。建议采用这种技巧。

--------------------------------华丽的分割线------------------------------

依赖关系

依赖关系指定在最后的程序中每一个文件与源文件的关系,在本章的前面的例子中,需要指定最后的程序需要依赖于main.o,2.o,3.o;同样,main.o依赖main.c和a.h;2.o依赖于2.c和a.h与b.h,3.o依赖于3.c和b.h与c.h。所以当main.c和a.h修改后就影响到main.o,main.c和a.h有一个修改后就需要重新编译main.c.

在makefile文件中,通过指定目标名称后加一个冒号,空格和制表符,然后用空格或制表符分割文件列表来建立目标文件,前面的例子的依赖关表如下:

这说明myapp依赖于main.o,2.o和3.o。main.o依赖于main.c以及a.h等等。

依赖关系集合给出了源代码间的继承关系。可以清楚的看到如果b.h改变了则需要修改2.o,3.o,由于2.o,3.o改变了就需要重建myapp。

 

如果你想构建几个目标文件,可以使用代号目标文件:all。假如你的程序包含myapp以及手册页myapp.1两个二进制文件,可以这样指定:

再重复一遍,如果不指定all目标,make简单的构造完makefile中的第一个目标就停下了。

 

--------------------------------华丽的分割线---------------------------------------------

规则关系

makefile的第二部分指明如何构造目标,在前几节的例子中,当make命令需要重建2.o时应当执行什么命令呢?也许简单使用gcc -c 2.c就已经足够了(make命令知道默认的规则),但是,当你需要指明一个include目录或是为了以后调试而加入调试符号又该如何办呢?通过在makefile文件中加入明确的规则就可以实现。

 

在此,需要提醒你makefile的一个奇怪和不幸的语法:空格符和制表符的差别。所有的规则所在的行都必须以tab制表符开始,空格不能开始新的一行。多个空格与制表符看起来没有什么差别,在Linux编程方面也没有很大的差别,但这会引起问题。makefile一行的末尾加入空格将导致make命令失败。但是这是历史遗留下的问题,而且有很多makefile试图去改变这个问题,所以务必要小心。幸运的是,make命令不工作是由于tab制表符丢失造成的。

 

试一试

大多数规则代表的简单命令都可以在命令行中敲入运行,作为例子,以下是你的第一个makefile:Makefile1

 

在上面的makefile中由于你未使用默认的名称:makefile或Makefile,所以使用-f 参数指定文件名。若果在没有源文件的目录中执行上述代码,你会得到如下信息:

$make -f Makefile1

make:*** No rule too make target 'main.c',needed by 'main.o'. Stop.

$

 

 

 

 (未完待续)

 

本人对翻译后的文字保留一切权利,转载请注明出处,有任何问题请email:shmtmc#163.com(将#改为@)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

原创粉丝点击