分类: 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 archive 或 unzip archive 可以解开这些压缩包(后者对自解压缩的‘.exe’包也有效)。
大
多数源码压缩包都含有 README 和 INSTALL
文件,这些文件是作者写的文档说明,讲的是如何编译、注意事项等等。我并不没有说一定要读这些文件;-),除非 INSTALL
文件开头有‘These are generic
instructions’,如果是这样的话,作者可能是无法忍受‘autoconf’自动生成的文件,而用自己更加有效的说明来替换了。
与压缩包中的其他文件一样,您可以用显示文本的程序,打开来阅读。
下面列出的是编译时需要的包,您可以用 rpm -q name 来查看这些包是否都已安装。
如果您用的是单 CD 版的 Mandrake Linux,那可能会缺少其中的某些包,如果是这样,您可以通过来获取 RPM 包。
有了这些库,您就可以完成大多数编译,而不会由于缺少某库而出错。
如果您要编译 GNOME 或 KDE 下的程序,您会用到各自库的‘-devel-’版本。对于 KDE,您还需要‘libqt-devel’。
关于库的包名,这里两个要注意的地方: