个人工具

UbuntuHelp:CompilingSoftware/zh

来自Ubuntu中文

跳转至: 导航, 搜索


Ubuntu的官方源有大量的包供你选择,你甚至可以从第三方的源获得更多的包。不过,有些时候,在以下的情况下,你可能需要把源代码编译成包。

  • 在源里没有这个包。
  • 源里的包的版本很老了。
  • 因为某些原因,源里的包屏蔽了程序中的某种特性。
  • 源里的包可能有bug,不过已经被编写这个包的作者修复了。
  • 你想检验一个补丁来帮助开发者修复错误。
  • 你想尝试亲手从零开始编译程序。

背景介绍

你可能需要去编译某种语言编写的程序。需要编译的程序一般是用C或者C++编写的。在这种情况下,你需要安装gcc编译器,这个编译器可以通过安装build-essential这个包来获得。一般,你可以在终端里输入以下的命令来安装:

sudo apt-get install build-essential

如果程序是用Java编写的,你需要Java运行库和编译器来编译。你可以按照这里[wiki.ubuntu.com/RestrictedFormats Java]的说明来安装java。有时候,也需要一个基于java的编译工具ant,这个包可以从Ubuntu的源里安装。

如果程序使用像python或者perl这种解释性语言来编写的,你只需要解析器就可以了,这个在Ubuntu中是缺省安装的。你可以直接运行这种程序,在多数情况下,你从Ubuntu源安装和运行程序的时候,需要安装额外的python或者perl程序。

你真的需要编译程序吗?

如果你因为源里面没有想要的包而打算编译程序,请在这里Ubuntu Package Search搜索,也可以从http://ubuntulinux.nl/source-o-matic 上的列表查看第三方的源。你也可以通过以下的命令来搜索可用的包:

apt-cache search <a keyword from the package>

获得源程序

总的来说,可以在作者的网站上下载压缩格式的源程序。一般的压缩格式有tar.gz.bz2zip。你可以通过以下的命令来解压:

tar -zvxf file.tar.gz
tar -jxvf file.bz2
unzip file.zip

有时候,你也需要使用CVS来获得高级代码。执行sudo apt-get install cvs来安装cvs程序。举个例子,要重新获取NetworkManager的源代码,执行以下的命令:

cvs -d :pserver:anonymous@anoncvs.gnome.org:/cvs/gnome login
cvs -d :pserver:anonymous@anoncvs.gnome.org:/cvs/gnome co NetworkManager

如果你通过cvs来安装,请注意这篇文章的结尾部分。

编译程序的三个步骤

大部分需要从源代码编译安装在Linux中的程序,可以通过./configure;make;make install这三个步骤来进行。最困难的步骤在于./configure这一步,之後的步骤就简单了。

configure

configure这个脚本会进行以下的工作:

  • 检查计算机中否有满足编译这个包所需的依赖
  • 可以修改查找这些依赖的缺省路径
  • 可以激活或屏蔽被编译程序的各种选项
  • 可以修改程序安装的路径

你可以执行以下的命令来查看configure脚本提供的各种参数选项:

./configure --help | less

例如,configure脚本缺省的安装路径是/usr/local。如果你需要改变这个路径,按照下面来执行configure这个脚本:

./configure --PREFIX=/opt

如果你真的从零开始编译程序,一定要阅读README和INSTALL文件。你会看到程序所需的依赖,通常是一些库,不过在不同的系统中它们的名字也是不同的。可以通过apt-cache工具来查找这些依赖的包,另一个更好的方法是,如果你编译的程序是源里就有的话,可以执行以下的命令来安装编译所需的依赖包:

sudo apt-get build-dep <package>

这个会保证这个包所需的依赖包全部被安装,如果你系统中安装有旧版本的依赖包,configure脚本就不会进行编译,在这种情况下,你就不得不也编译这些依赖包了。

configure常见问题的决方法

尽管完成上面所说的步骤,但是configure也有可能失败。

  • 编译就必须安装-dev这个包。
  • 编译GNOME的程序,需要gnome-devel这个包;对于KDE程序,需要kde-devel这个包。
  • C和C++的库的名称都是以lib开头的,所以如果./configure提示缺少foo库,需要安装libfoo-dev这个包。
  • 如果编译脚本提示需要"X includes",可能需要安装这些包:xlibs-dev、xlibs-static-dev、x-window-system-dev
  • 还有其他的方法来判定需要那些依赖包,可以通过使用auto-apt工具或者apt-file工具(auto-apt会快一点)。
sudo apt-get install auto-apt
sudo auto-apt update
auto-apt search missing-file.h

使用apt-file也是和上面一样,只要把"auto-apt"替换成"apt-file"即可。

  • 因为特性而编译失败,可以通过./configure --disable-FEATURE来屏蔽特性。
  • 如果你自己不能解决问题,可以在#ubuntu这里寻求帮助。

如果不存在configure文件,你就要检查一下configure.ac是否存在(不过第一步,还是应该仔细阅读一下INSTALL和README文件)。如果configure.ac文件存在,那就是开发者忘记了生成最终的 configure文件。你自己可以通过autoconf这个包来生成configure文件:

sudo apt-get install autoconf

安装了以後,你可以输入:

autoconf

然後,如果运气好的话,就会生成configure文件。

编译包

一切顺利的话,configure这个步骤就结束了,接下来,才是正式开始编译。这个只需这样做:

make

一切正常的话,在源代码存放的文件夹下面就会有能够运行的程序了。你可以尝试运行一下:

src/program_name

如果这一步程序失败了,那很可能程序有bug,你应该联系开发者,让他留意这个问题。

安装包

如果一切顺利,你可以输入以下命令来安装程序:

sudo make install

不过,更好的方法是使用CheckInstall来生成一个.deb文件,这会使以後能够方便地卸载这个包。

注意

  • 如果是内核程序,你需要gcc-3.4(在breezy上)和kernel-headers包,输入sudo apt-get install gcc-3.4 linux-headers-$(uname -r)来安装。要注意,每次内核更新了,内核程序都必须重新编译(而且也要下载新的header)。关于如何编译一个完整的内核,参考KernelCompileHowto。
  • 如果你想重新编译已经存在的debain包,输入dpkg-buildpackage -rfakeroot,而且如果某个包丢失了,编译脚本会提示这个包的名称。
  • 如果你从cvs中编译,一般需要从cvs中获取源代码,并且运行autogen.sh来生成configure脚本。

解释性语言

如果没有安装相应的模块,解析性语言编写的程序会运行失败。

  • Perl模块一般是像foo::bar这样引用的(例如xml::parse),不过这个包的名称叫做libfoo-bar-perl(libxml-parser-perl),如果名称有些不同,可以利用apt-cache来搜索,例如:
apt-cache search foo | grep bar
apt-cache search xml | grep parser
  • Python的模块叫做python-module,所以python的mysql模块就叫做python-mysqldb,这种对应比较一致,所以apt-cache能够发挥很好的作用。像这样来搜索:
apt-cache search python | grep mysql

可以帮助你获得所需的python模块。

一些建议

对于新手来说,参考CompilingEasyHowTo会更加容易明白。

而且,你会发现CheckInstall很有用。