Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7693605
  • 博文数量: 637
  • 博客积分: 10265
  • 博客等级: 上将
  • 技术积分: 6165
  • 用 户 组: 普通用户
  • 注册时间: 2004-12-12 22:00
文章分类

全部博文(637)

文章存档

2011年(1)

2010年(1)

2009年(3)

2008年(12)

2007年(44)

2006年(156)

2005年(419)

2004年(1)

分类: C/C++

2005-06-29 21:50:00

*

软件是由程序语言写成的。其中,有一类语言称为‘脚本语言’,当您编写完后就可以直接运行,典型代表有 Perl、Python 及 Tcl/Tk。这些语言带有解释器,用来在程序和系统之间做翻译。

软件是由程序语言写成的。其中,有一类语言称为‘脚本语言’,当您编写完后就可以直接运行,典型代表有 Perl、Python 及 Tcl/Tk。这些语言带有解释器,用来在程序和系统之间做翻译。

另外一类语言,如 C 和 C++, 需将写好的程序先编译成二进制代码(‘binary’),然后才能运行。

自然,每种语言都有各自优缺点:解释型的语言开发起来快;而二进制代码则由于不需要解释器,运行速度更快,也更适合大型的项目。

编译过程是将人们可以阅读的文本,即源代码,翻译成机器可读的文件,也就是二进制代码。所以编译时,您需要的第一件法宝就是编译器。在 Linux 中,‘gcc’用来编译主要由 C 语言写成的程序,而 C++ 是由‘g++’(即‘gcc-c++’)来编译。

一些复杂的程序可能包含大量源代码文件。为了简化编译过程,编译指令经常被放在一个文件中,这就是‘Makefile’文件。要应用这个文件,您就需要‘make’程序。‘make’读取(解析‘parse’)‘Makefile’文件,并给编译器提供合适的参数。您可以通过编辑‘Makefile’文件,来改变这些参数(比如将编译好的文件放在何处)

写程序时,开发员并不需要从零开始,可以用一些库(‘library’),这些库提供了许多常用的函数。开发员只要在源代码文件中,给用到的某些库或库中的函数作适当链接(‘link’),然后,编译好的二进制在运行时就会用到这些库。
现在,如果您编译程序,编译器需要获取程序用到的一些库的源代码文件,这些文件也被称为头文件(‘header file’),所以,您同时也要有这些文件。
由于您只是在编译时才需要头文件,所以有必要将库的RPM包一分为二:一个含有程序运行时需要的文件,而另一个是编译程序时需要的文件。这正是现在发行版的常用办法:一个包是库本身(‘runtime’version);另外一个,以‘-devel-’(‘development’开发)来标识,里面是头文件。
所以,您同时也需要程序用到的库的头文件包。

您可能会问,如何才能知道程序需要哪些库?最简单的办法是试着编译源代码。如果无法找到需要的库,编译过程将中止。
第二个办法是直接看‘Makefile’文件。在这个文件头部,以 LIBS = 开头的那一行,列出的就是需要的库。请注意,这些库以缩写的方式列出:比如,‘ -lX11’指的是文件名‘libX11.so’。用 locate libX11.so 可以检查这个文件是否已安装在您的系统中。
第三个办法是‘configure’脚本,这个文件由程序员用‘autoconf’工具生成。该脚本运行时,将检查所有需要的库和函数在系统中是否都可用。如果无法满足,将运行失败,并且告诉您出错原因。

* *

*

源代码是以压缩包的方式发布的,这是由于一般含有多个文件,而且对于文本文件的压缩,效果显著。

在 UNIX 中,压缩包用到两种程序:一种将多个文件归到一个包中,另一种再负责压缩。按照惯例,gzip压缩包以‘tar.gz’或‘tgz’结尾,而bzip2压缩的则以‘tar.bz2’或‘tbz2’结尾。这些包都通俗地称为‘tarballs’。

要解开压缩包,您可以用一些图形包管理器,比如 KDE 中的‘Archiver’或 GNOME 的‘guiTAR’。在 KDE 和 GNOME 中,您只要在各自的文件管理器中,单击(或双击)压缩包,程序就会自动开启。
在命令行下,您可以用

tar xzf archive 解开gzip的压缩包,而

tar xjf archive 则解开bzip2包(旧版的 tar 要用‘y’代替‘j’)
第一个参数‘x’用来解压缩(‘extract’),如果是新建压缩包,那您得用‘c’替换,只是列出压缩包内容的话,用‘t’。第二个参数对应于用到的压缩工具。‘f’告诉‘tar’将有一个文件名。另一个用得较多的参数是‘C’,表示将解开来的文件放到其他目录,比如:

tar xzfC archive dir

单一的‘bzip2’、甚至是‘zip’,在 Linux 世界中较为少见,用bunzip2 archiveunzip archive 可以解开这些压缩包(后者对自解压缩的‘.exe’包也有效)

* *

*

大 多数源码压缩包都含有 README 和 INSTALL 文件,这些文件是作者写的文档说明,讲的是如何编译、注意事项等等。我并不没有说一定要读这些文件;-),除非 INSTALL 文件开头有‘These are generic instructions’,如果是这样的话,作者可能是无法忍受‘autoconf’自动生成的文件,而用自己更加有效的说明来替换了。
与压缩包中的其他文件一样,您可以用显示文本的程序,打开来阅读。

* *

*

下面列出的是编译时需要的包,您可以用 rpm -q name 来查看这些包是否都已安装。
如果您用的是单 CD 版的 Mandrake Linux,那可能会缺少其中的某些包,如果是这样,您可以通过来获取 RPM 包。

编译器

  • gcc
  • glibc-devel
  • gcc-c++
  • libstdc++-devel

有关系统

  • make
  • kernel-headers

常用的库

有了这些库,您就可以完成大多数编译,而不会由于缺少某库而出错。

  • libgtk+-devel, libglib-devel 在部件设定(widget set)中常用
  • libgr-devel, libungif-devel, libjpeg-devel, libpng-devel, libtiff-devel, libxpm-devel 图像格式
  • libtermcap-devel, libncurses-devel 用于控制台程序
  • XFree86-devel 用于所有的图形程序
  • zlib-devel 有关压缩的库

如果您要编译 GNOME 或 KDE 下的程序,您会用到各自库的‘-devel-’版本。对于 KDE,您还需要‘libqt-devel’。

关于库的包名,这里两个要注意的地方:

  1. 旧版 Mandrake Linux 中库包名称不会以‘lib’打头,比如,‘libgtk+-devel’对应于‘gtk+-devel’。
  2. 一些库的包可能在归档名中有版本号,比如,‘libpng-devel’现在的实际名称是‘libpng3-devel’。当然,这个并不重要,我只是希望您不至于混淆 ;-) 。
阅读(3357) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~