Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7693740
  • 博文数量: 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:51:42

*

现在,大多数源码包都含有‘configure’脚本,用来检查在当前系统上,能否完成编译。

./configure --help

*

现在,大多数源码包都含有‘configure’脚本,用来检查在当前系统上,能否完成编译。

./configure --help

在源码的目录中,执行上面的命令,将列出一段‘configure’可用参数的摘要。您没必要感到困惑,因为在大多数情况下,默认值就能够顺利通过。
但其中有一个参数,您得留点儿神,这就是‘--prefix=[DIR]’,一般在参数列表的开头。这个参数是用来指定,编译好的程序和库将要安放的位 置,一般是‘[/usr]’或‘[/usr/local]’。这两个目录都可以,我个人更喜欢将自编译的程序放在‘/usr/local/’下,这样可以 使系统目录结构更加清晰。
但是,有些 KDE 程序以为您有‘/opt/kde’目录,并且将其当成默认安装目录。Mandrake Linux 应该有这么个目录,但由于 KDE 文件都安装在 ‘/usr’下,您可能需要在运行‘configure’时,改变这个值:

./configure --prefix=/usr

您或许不明白,为什么输入‘./configure’而不是‘configure’。这是由于新建的源码目录通常不在您的 shell 路径中,所以,如果您输入 configure,shell 会显示:

bash: configure: command not found

必须告诉 shell,您想执行的命令在当前目录下,这就要在命令前加‘./’。

请注意:实际不需要、我也不推荐用‘root’帐号运行‘configure’脚本。

* *

*

‘configure’开始运行,将检查您的系统。这个过程的输出将在终端上显示,并同时存放到新建的‘config.log’文件中。如果碰到会阻碍完成编译的错误,检查将自动停止。
同时显示出错信息,并写入‘config.log’文件,比如:

/usr/bin/ld: cannot open -lXt: No such file or directory
collect2: ld returned 1 exit status

看起来缺了什么,但‘-lXt’是哪个东东?这是在编程中惯用的表示方法:‘l’表示‘lib...so’,所以需要的是‘libXt.so’文件。
有可能这个文件在您尚未安装的某个 -devel-.rpm 包中。如果您在使用 Mandrake Linux 7 及其后继版本,可以用‘Software Manager’(即‘RpmDrake’),来搜索含有这个文件的包(‘Tree - See available packages’然后‘Search - File’),或者在命令行下用 urpmf file
在旧的发行版本中,可以进入含有 RPM 包的光盘目录中(/mnt/cdrom/Mandrake/RPMS),然后运行命令:

for i in *.rpm ; do rpm -qpli $i | grep file && echo $i ; done

(用您要搜索的文件名替换 file
您将看到,前面缺少的文件属于‘XFree86-devel’包。接下来,就安装这个 RPM 包,可以用您喜欢的 RPM 图形应用程序、‘urpmi’,或使用

su -c 'rpm-i XFree86-devel*'

现在删除源代码目录下的‘config.cache’文件,再运行‘configure’。如此重复,直到‘configure’通过。

如果实在找不到含有您需要文件的 RPM 包(很少见),而且文档中也没有相关的信息, 您可以与软件作者联系,作者应该是再清楚不过了,但是,您务必要先仔细重复前面的步骤。

* *

*

如果‘configure’运行成功后,就可以真正地编译源码了:

make

这个过程应当不会出现任何错误,除非‘configure’脚本自身有问题(当然,可能发生意外)
‘make’时出现的错误可能有些难于理解,但总体来说和前面描述的有些类似。
如果出错,可能如:

file:line: file: No such file or directory

file1: in file | function name:
file2:line: undefined reference to function

在第一种情况下,请安装含有相应文件的 RPM 包。有涉及到函数名的错误,经常是由于程序用到的库的版本比已安装的要新或更旧。您可以查一下有没有该库的新版或旧版,然后安装。

通常需要运行:

make clean

再编译试试。

好了,假定您现在已经完成,现在终于可以安装啦!用 root 帐号运行:

su -c 'make install'

准备好了吗?试试新装的程序吧 ;-) 。当然,要确认您已经将可执行文件放到了系统的 中,否则用 ln -s source destination 新建一个符号链接(‘symlink’)到‘/usr/local/bin’,或者也可以将该目录直接添加到系统的路径中。

* *

*

许多人都不知道怎么做,但通常卸载用 make install 安装的软件很简单 。您只要到 Makefile 所在的目录,然后键入:

su -c 'make uninstall'

作者在 Makefile 中提供了不少要删去的目标。

如果常常从源代码安装程序,那您得看一下 ,这个工具用来将编译好的程序变成 RPM 包,然后直接安装 RPM 包。这样简化了卸载过程(只要用rpm -e name,并且以后安装需要相应文件的 RPM 包时 ,不会出现依赖问题。
Mandrake Linux 8.2 的用户请注意:请不要用您光盘中的 CheckInstall RPM 包,因为其无法工作,您可以从网站上下载 RPM 包。

* *

*

一个补丁或 diff 文件,是特殊格式的文本文件,里面有‘patch’程序要执行的指令,以修改源码文件。

‘patch’命令看起来类似于:

patch -pnumber <patch_file

容易变化的部分是‘-p’参数后面的‘number’,定义了补丁应用于何种扩展方式的路径:
‘-p0’是应用补丁文件中给出的全路径,‘-p1’则删掉第一个斜杠(slash:/),依此类推。
没有指定的‘-p’将除去全部路径,如果这个补丁只是应用于同一个目录下的文件,这样做就很好。

通常的做法是,将补丁文件放在源代码的上一级目录,然后运行

patch -p1 <patch_file

如果这样不行,试试‘-p’后跟其他数字。

阅读(2030) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~