Linux 版 (精华区)

发信人: howdoit (教练让我上场!!!), 信区: Linux
标  题: 在Linux上编译程序
发信站: 哈工大紫丁香 (Tue May 18 09:04:56 1999), 转信

《Linux公报》……让Linux更富魅力!

               在Linux上编译程序

                       By JC Pollman    帆译

    你们中的很多人,也包括我在内,都不是程序员,但是这并不意蹲盼颐蔷筒荒苁芤

嬗诳旁绰耄趸虺隽Π镏5馊匆馕蹲诺北嘁氤龃淼氖焙颍晕颐呛懿焕F涫

当嘁胪ǔJ呛芗虻サ模翰挥孟蟊喑棠茄傩模潜嘁氩⒉皇前俜种俨换岢龃淼氖隆

O旅媸歉率值谋嘁胫改希梢愿跹д0%的解决方案。 

    每个人迟早都要下载程序的源码,然后试着编译它。如果你是

RedHat或Debian的忠实追随者,你最终会发现一个程序不是太老就是

太新,而去找已经编译过的二进制代码。坏的一方面是这些代码可能

无论你怎么做,它们永远不能被正确的编译---记住,大多数的Linux

程序最多只是beta测试版。好的一方面是在过去的五年中编译没有问

题的程序正在增加,而且即使你不是程序员,你也可以“修复”那些

不能正确编译代码。 

  

下载以后: 

    现在你的硬盘上应该有一个某种类型的压缩包。首先,你必须把

它解压(uncompress),并把它解包(untar)到一个目录。在习惯上,很

多人都把它们放到这个目录:/usr/src。这样能把所有的东西都放在

一个地方,你以后可以清除它们。使用这个目录需要有root身份。如

果一个用tar打包的文件是用gzip压缩的,则Linux的tar程序可以同时

把它解压和解包。如果你的文件名叫做:filename.tar.gz,你可以到

/usr/src目录,然后键入: 

    tar -xzvf /{path to file}/{filename.tar.gz} [Enter] 

    这将会把这个文件解压并解包。这里是几个参数简单的解释: 

    x - 把文件解包 

    z - 把文件解压 

    v - 显示处理过程 

    f - 后面跟着你要处理的打包文件名 

    如果你用netscape下载的这个文件,可能会看到错误。有时

netscape会为你解压这个文件。因此,如果你象上面这样untar它,你

可能会看到这样的信息: 

     gzip: stdin: not in gzip format 

     tar: Child returned status 1 

     tar: Error exit delayed from previous errors 

试着执行上面的命令,但把z参数删掉,就是这样: 

     tar -xvf /{path to file}/{filename.tar.gz} [Enter] 

    除了gzip,有些文件是用bzip2来压缩的,因此这些文件看起来象

这样 the-program.tar.bz2。z参数对这种文件不起作用。解开这种文

件最简单的方法就是 bunzip2 the-program.tar.bz2。这样将把使用

下面命令解包出来的 the-program.tar文件解开: 

     tar -xvf /{path to file}/{filename.tar.gz} [Enter] 

解包以后: 

    cd到刚才解包时创建的那个目录里。用ls看看这个目录里的文

件。首先你应该读读README和INSTALL文件。如果你没读这些文件,不

要想从别人那里得到帮助。这是RTFM这个缩写在网上使用很广泛的原

因(RTFM是`Read The Fucking Manual'的缩写。README和INSTALL文件

将会告诉你如何编译和安装这个程序。 

    要编译它,执行"make"命令。为了让"make"可以开始编译,必须

有个叫Makefile的文件(你也可以通过在命令行上来写入make的参

数,但那不在本文的讨论范围只内)有通常三个方法开始编译:

simple,Imake和configure。 

Simple 编译: 

    如果你看到一个叫Makefile的文件 -- 没有叫Imake或configure

的文件,那么你就使用这个方法来编译。因为不能为你的计算机设

置,所以用这种方法来编译有很多问题。通常README和INSTALL文件会

告诉你如何编辑某些文件来使它可以正常编译。通常,你可以这样

做: 

     make [Enter] 

     make install [Enter] 

如果一切正常,那么你现在就可以运行这个程序了。 

Imake: 

    如果ls这个目录看到有Imake文件,并且没有Makefile,那么你就

使用这个方法。这是一个设置编译的比较老的方法。基本上你要键

入: 

     xmkmf [Enter] 

     make [Enter] 

     make install [Enter] 

Configure: 

    如果这个目录中有个叫configure的文件,那就要用这个方法。这

是编译程序最简单的方法,而且编译成功率很高。本质上,它会检查愕恼飧鱿低常床

榭疵恳桓隹赡艿目藓椭С治募慈繁D憧梢员嘁胝飧龀绦颍缓蟾菡庑┱返男畔⒗

创唇akefile文件。如下执行:

     ./configure [Enter] 

     make [Enter] 

     make install [Enter] 

    注意第一个命令前面的./。当你键入一个命令的时候,shell会在

你的路径里查找文件。它不从当前目录开始查找,因此如果./(代表当

前目录)没有在路径里,虽然ls看的见这个文件,但是shell却找不

到。shell能执行make是因为它通常都在/usr/bin里,而/usr.bin在路

径里。要看路径,如下执行: 

     echo $PATH [Enter] 

  

如果出现错误: 

  

    不能编译的最常见错误原因是找不到文件。几乎所有的程序都靠

有些程序,文件或库的支持。如果它们找不到,程序就不能编译。

README/INSTALL文件应该告诉编译这个程序所需要哪些文件,和这些

文件的版本。注意:错误的版本会象根本没有这个文件一样让你不能

编译。通常,你要知道是不是这个问题可以从编译程序输出结尾的错

误信息中得知,这些信息将告诉你找不到什么文件。注意:有时你有

这些文件,但是它们不在Makefile文件所指明的地方。使用linux的发

布安装程序,例如rpm,来检查你是否丢失了某些文件。如果没有这些

文件的话,去找它,如果有,并且版本正确,检查Makefile文件看看

它要求这个文件放在什么地方。例如:moc文件在/usr/local/bin里,

但是Makefile说: moc=/opt/bin/moc。编辑一下Makefile(用vi或者

任何什么文本编辑器)然后改一下moc的路径即可。 

另一个常见的错误是丢掉了"include"的文件。很多程序的中的原文件

的头几行是这样的: 

    #include <gtk/gtk.h> 

    #include <netinet/in.h> 

    #include <arpa/inet.h> 

    #include <stdlib.h 

    这些"h"文件(或者叫头文件)必须存在于你的计算机里。最少你应

该有内核的头文件,使用ls /usr/include/linux查看。如果你安装了

一些库,象gtk,确定也安装了它们的开发文件。有时同一个库的几个

版本可能导致一些问题,每个版本可能把它的头文件放在不同的地

方,可你并不知道编译的时候使用的到底是哪个文件。 

    如果你改变了Makefile中的所有应该改变的地方,并且所有的库

和头文件都对,而它仍然不能编译,那么顺序如下做: 

    1、如果你是从一个和这个程序的主站不同的另外一个站点下载的

这个程序,那么去它的主站看看有没有更新的版本可以使用。 

  

    2、去www.dejanews.com这个站点,搜索一下这个程序。这里很可

能有其他人遇到了同样的问题,并且已经贴出来了解决方法。 

    3、如果所有的方法都不行的话,email给作者。很多作者对改进

他们的程序以及bug报告和性能建议都很有兴趣,通常都会被很好的接

受(记注:这是linux,不是商业软件。)注意:你的bug报告最好多说

些关键的情况,不要只说一句"这个程序不能编译"!我通常是email过

去编译结果的最后十行或更多行,这样作者才能看到是那里出现的错

误。如果我真的喜欢这个程序,我会在下一个新版本发布以后尽可能

给作者游泳的反馈。注意,程序员也是人 -- 他们会有两个星期的休

假、跳槽、搬家等等其他十五,因此不要期望能够立即得到回复。  

    最后,有些程序有唯一的编译设置:马上能想到的有qt和内核,

我再最后重复一遍:读README和INSTALL文件! 

  

                       版权所有 (C) 1999 NJLUG

           出版于第38期《Linux公报》1999年3月 中文版第五期

                            


--
☆ 来源:.哈工大紫丁香 bbs.hit.edu.cn.[FROM: bin@mtlab.hit.edu.cn]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:3.073毫秒