构建和安装 Linux 包
发布: 2009-6-01 09:28 | 作者: 林溪雪 | 来源: StmFans思蜕盟 OPELC 自由电子联盟
构建和安装 Linux 包 http://man.chinaunix.net/develop ... Building-HOWTO.html
作者:Mendel Cooper --- http://personal.riverusers.com/~thegrendel/
译者:bobkey
英文版 v1.91, 27 July 1999
中文版 v1.91, 22 Aug 2006
这是一个在 Linux下构建和安装类 UNIX 软件发行版的全面指南,并增加了一些 "rpm" 和 "deb" 二进制安装包。
1. 入门介绍
许多各种各样的 UNIX 和 Linux 软件是源码形式的压缩文件。这些一样的安装包在编译后运行在不同的机器,而且软件作者会保存多个版本。一个单一的软件包发行版可能会因为这样而停止。在不同的平台,Inetl、DEC Alpha、RISC 工作站,或任何机器,很不幸的是这个安装软件包的人物通常是终端用户,是系统管理员,也可能就是你自己。拿出你的热情来,通过本指南将证明这个过程并不是那么可怕和神秘。
2. 解压缩文件
你通过下载或其他方式获得了一个软件包,通常它是一个压缩文件,大部分可能是存档的 (tarred)和压缩的 (gzipped),这些 .tar.gz 或 .tgztar (来自知名地方发布的"tarball")。首先拷贝它到一个工作目录,然后 untar 和 gunzip 解压它。 通常这个命令是 tar xzvf filename,filename 是软件文件名称,解压后的文件一般会在当前目录下的创建子目录,并以这个包名来命名。 注意,假如包名称是.Z为后缀,那么刚才讲的方法不适用了,不过幸好可以通过 uncompress解压,然后再用 tar xvf .解压后的包可以看到有那些文件。你也可以用用这个命令预先查看结果 tar tzvf filename,显示包里有那些解压文件。
上述的解压"tarballs" 方法和下面的命令是一样的:
* gzip -cd filename | tar xvf -
* gunzip -c filename | tar xvf -
(这个 '-'符号是tar命令通过管道取到的输出来自于 stdin.)
源文件如果是新的 bzip2 (.bz2) 格式,可用 bzip2 -cd filename | tar xvf -,或更简单的 tar xyvf filename ,这很不错的tar命令被不断的完善(关于更多的详细内容可参考 Bzip2 HOWTO ). Debian Linux上的 tar 使用一个不同的功能补丁,是 Hiroshi Takekawa 编写的, 可以用 -I, --bzip2, --bunzip2 的特殊选项的 tar 版本。
[非常感谢 R. Brock Lynn 和 Fabrizio Stefani 更正和更新了上面的信息.]
有时候一些文件必须安装在用户的 home 目录下,或更多的是在一个固定的目录,比如 /, /usr/src, 或 /opt 。所以必须仔细阅读安装包的配置信息。当你试图去 untar 一个包的时候或许会得到一个错误消息,所以基于这些原因要去阅读安装包的 docs, 特别是 README 或安装文件,如果有config 和 Makefiles 文件则最好去编辑它,这里包括了安装指令和说明。提示:你改变 makefile 会导致不同的结果。大部分软件包允许用 make install 自动处理安置二进制文件在适当的系统位置。
* 你可能碰到过一些共享文件、shell 存档文件、尤其是 Internet 上的源码新闻组。它们保留的原因是具有人性化的可读性,并且允许新闻组缓冲并通过它们筛选和剔除出不合格的。它们可能用 unshar filename.shar 命令来解压。些不同的程序在交易时统称为"tarballs"。
* 一些源码存档文件是用非标准的 DOS,Mac 或其他压缩的比如:zip, arc, lha, arj, zoo, rar, and shk. 幸运的是在 Sunsite 和其他存放 Linux 解压程序的地方,都有能有效解压所有这些压缩文件的工具。
有时候,你可能需要使用一个 patch 或显示改变了的 diff 文件来升级或修复存档的源码文件。这 doc 文件或者 README 文件将告诉你怎么去使用。一个很好的命令用标准语法来调用的命令是 patch < patchfile.
你现在可以进入进行构建的阶段了。
3. 使用Make
Makefile 是构建过程中的重点。 比较简单的是, Makefile 是脚本,用来编译或构建二进制,包括了包的可执行选项部分。Makefile同样能提供升级软件包的方法,而不需要重新编译任何套件中的原文档。但这个是不同的情况(或不同的约定)。
某些情况是 Makefile 加载 cc 或 gcc 。这是预处理, C (或 C++) 编译和链接按照顺序来调用它们。这个过程是把源码转换成二进制并可执行。
调用 make通常的方法是输入 make。一般是为这个包构建所有的必须的可执行二进制文件,make同样也能执行其他任务,比如安装文件到适合的目录 (make install) ,并删除目标文件 (make clean).运行 make -n 能预览构建过程,用 make 打印输出所有的命令,而实际上并不需要去执行它们。
只有简单软件使用基本的 Makefile。更多复杂的安装需要根据不同机器的本地 libraries, include 文件来定制,特别是构建需要 X11 libraries 的安装。 Imake 和 xmkmf 可完成这样的任务。
Imakefile 可参照 man page 做模版 Makefile. imake 有效的通过 Imakefile 来根据你的系统制作 Makefile。在所有情况下,尽管你运行 xmkm,一个 shell 脚本来调用 imake, 是前端界面。检查 README 或 INSTALL 文件包括软件包中给的指定的指令。(否则 Imake 在包含这些源文件基本的目录的时候 xmkmf 应该会运行)阅读 Imake 和 xmkmf man pages 可以得到更多有效的分析。
必需知道的是调用 xmkmf 和 make 需要用 root 权限, 特别是用 make install 移动二进制到 /usr/bin 或 /usr/local/bin 目录里。普通用户没有 root 权限来 make 的时候很可能会导致write access denied 错误消息,因为你缺乏这些系统目录的许可权限,二进制创建还需要可执行权限给你和其他的用户。
通过调用 xmkmf ,用 Imake 文件构建一个新的适合你的系统的 Makefile 。你正常调用 xmkmf 会附加 -a 参数,来自动的做 make Makefiles, make includes,和 make depend 这会定义变量和函数库给编译器和连接器。有时会没有 Imake 文件,可用 INSTALL 或 configure 脚本完成这个单元。提示你运行 configure, 需要这样来调用 ./configure 要确保 configure 脚本在当前目录可访问大部分情况下 README 包括发布和解释安装程序的说明。
通常一个好方法是检查 Makefile 是否是 xmkmf 或其他程序构建的。Makefile 通常能正确检测出你的系统,但有时候需要手动调整它的错误。
安装刚才构建的二进制到适当的系统目录通常以 root 运行 make install 。这个目录一般在现在流行的 Linux 发行版上是 /usr/bin, /usr/X11R6/bin和 /usr/local/bin。新包的首选项是 /usr/local/bin, 以便和 Linux 原始安装的文件区分开来。
最初的商业版的 UNIX 会安装在 /opt 或其他不熟悉的目录上,这很明显会导致一个安装目录不存在的错误。有个简单的方法就是用 root 建立一个 /opt 目录,让包能安装到。并且增加目录到 PATH 的环境变量里。为了兼容,你可以选择创建一个链接到 /usr/local/bin 目录。
你的基本安装步骤如下:
* 读一下 README 文档和其它应用文档。
* 执行 xmkmf -a, 否则用 INSTALL 或 configure script.
* 检查一下Makefile 。
* 如果需要, 执行一下 make clean, make Makefiles, make includes, 和make depend 。
* 运行 make.
* 检查文件的权限.
* 一般都必须要执行一下make install.
提示:
* 你如果没有 root 权限来安装,那么用 su 切换到 root 来安装和编译二进制到系统目录是必须要的。
* 在接下来使用比较合适的 make,你可能需要增加一些选项达到最佳,用标准的 Makefile 传递给 gcc 来编译,Makefil 包括或创建一个包为你安装,一些公开的的选项有 -O2, -fomit-frame-pointer, -funroll-loops, and -mpentium (如果你运行的是Pentium cpu). 在使用这些选项的时候要理解,并小心在 Makefile 中修改最佳参数。
* 然后用 make 创建二进制,你可能要用 strip 。strip 命令能删除来自二进制的调试符号,减少占用的磁盘空间,当然这也关闭了调试信息。
* Pack Distribution Project 提议不同步骤建立的软件包,基于 Python 的脚本工具来管理调试符号,把它们放在不同的单独目录里。这些存档文件是普通的 tarballs, 但它们安装在 /coll 和 /pack 里的目录。你也许要找到它则必须要在上面这个站点 http://sunsite.auc.dk/pack/ 下载 Pack-Collection ,来运行其中发布的一个。
作者:Mendel Cooper --- http://personal.riverusers.com/~thegrendel/
译者:bobkey
英文版 v1.91, 27 July 1999
中文版 v1.91, 22 Aug 2006
这是一个在 Linux下构建和安装类 UNIX 软件发行版的全面指南,并增加了一些 "rpm" 和 "deb" 二进制安装包。
1. 入门介绍
许多各种各样的 UNIX 和 Linux 软件是源码形式的压缩文件。这些一样的安装包在编译后运行在不同的机器,而且软件作者会保存多个版本。一个单一的软件包发行版可能会因为这样而停止。在不同的平台,Inetl、DEC Alpha、RISC 工作站,或任何机器,很不幸的是这个安装软件包的人物通常是终端用户,是系统管理员,也可能就是你自己。拿出你的热情来,通过本指南将证明这个过程并不是那么可怕和神秘。
2. 解压缩文件
你通过下载或其他方式获得了一个软件包,通常它是一个压缩文件,大部分可能是存档的 (tarred)和压缩的 (gzipped),这些 .tar.gz 或 .tgztar (来自知名地方发布的"tarball")。首先拷贝它到一个工作目录,然后 untar 和 gunzip 解压它。 通常这个命令是 tar xzvf filename,filename 是软件文件名称,解压后的文件一般会在当前目录下的创建子目录,并以这个包名来命名。 注意,假如包名称是.Z为后缀,那么刚才讲的方法不适用了,不过幸好可以通过 uncompress解压,然后再用 tar xvf .解压后的包可以看到有那些文件。你也可以用用这个命令预先查看结果 tar tzvf filename,显示包里有那些解压文件。
上述的解压"tarballs" 方法和下面的命令是一样的:
* gzip -cd filename | tar xvf -
* gunzip -c filename | tar xvf -
(这个 '-'符号是tar命令通过管道取到的输出来自于 stdin.)
源文件如果是新的 bzip2 (.bz2) 格式,可用 bzip2 -cd filename | tar xvf -,或更简单的 tar xyvf filename ,这很不错的tar命令被不断的完善(关于更多的详细内容可参考 Bzip2 HOWTO ). Debian Linux上的 tar 使用一个不同的功能补丁,是 Hiroshi Takekawa 编写的, 可以用 -I, --bzip2, --bunzip2 的特殊选项的 tar 版本。
[非常感谢 R. Brock Lynn 和 Fabrizio Stefani 更正和更新了上面的信息.]
有时候一些文件必须安装在用户的 home 目录下,或更多的是在一个固定的目录,比如 /, /usr/src, 或 /opt 。所以必须仔细阅读安装包的配置信息。当你试图去 untar 一个包的时候或许会得到一个错误消息,所以基于这些原因要去阅读安装包的 docs, 特别是 README 或安装文件,如果有config 和 Makefiles 文件则最好去编辑它,这里包括了安装指令和说明。提示:你改变 makefile 会导致不同的结果。大部分软件包允许用 make install 自动处理安置二进制文件在适当的系统位置。
* 你可能碰到过一些共享文件、shell 存档文件、尤其是 Internet 上的源码新闻组。它们保留的原因是具有人性化的可读性,并且允许新闻组缓冲并通过它们筛选和剔除出不合格的。它们可能用 unshar filename.shar 命令来解压。些不同的程序在交易时统称为"tarballs"。
* 一些源码存档文件是用非标准的 DOS,Mac 或其他压缩的比如:zip, arc, lha, arj, zoo, rar, and shk. 幸运的是在 Sunsite 和其他存放 Linux 解压程序的地方,都有能有效解压所有这些压缩文件的工具。
有时候,你可能需要使用一个 patch 或显示改变了的 diff 文件来升级或修复存档的源码文件。这 doc 文件或者 README 文件将告诉你怎么去使用。一个很好的命令用标准语法来调用的命令是 patch < patchfile.
你现在可以进入进行构建的阶段了。
3. 使用Make
Makefile 是构建过程中的重点。 比较简单的是, Makefile 是脚本,用来编译或构建二进制,包括了包的可执行选项部分。Makefile同样能提供升级软件包的方法,而不需要重新编译任何套件中的原文档。但这个是不同的情况(或不同的约定)。
某些情况是 Makefile 加载 cc 或 gcc 。这是预处理, C (或 C++) 编译和链接按照顺序来调用它们。这个过程是把源码转换成二进制并可执行。
调用 make通常的方法是输入 make。一般是为这个包构建所有的必须的可执行二进制文件,make同样也能执行其他任务,比如安装文件到适合的目录 (make install) ,并删除目标文件 (make clean).运行 make -n 能预览构建过程,用 make 打印输出所有的命令,而实际上并不需要去执行它们。
只有简单软件使用基本的 Makefile。更多复杂的安装需要根据不同机器的本地 libraries, include 文件来定制,特别是构建需要 X11 libraries 的安装。 Imake 和 xmkmf 可完成这样的任务。
Imakefile 可参照 man page 做模版 Makefile. imake 有效的通过 Imakefile 来根据你的系统制作 Makefile。在所有情况下,尽管你运行 xmkm,一个 shell 脚本来调用 imake, 是前端界面。检查 README 或 INSTALL 文件包括软件包中给的指定的指令。(否则 Imake 在包含这些源文件基本的目录的时候 xmkmf 应该会运行)阅读 Imake 和 xmkmf man pages 可以得到更多有效的分析。
必需知道的是调用 xmkmf 和 make 需要用 root 权限, 特别是用 make install 移动二进制到 /usr/bin 或 /usr/local/bin 目录里。普通用户没有 root 权限来 make 的时候很可能会导致write access denied 错误消息,因为你缺乏这些系统目录的许可权限,二进制创建还需要可执行权限给你和其他的用户。
通过调用 xmkmf ,用 Imake 文件构建一个新的适合你的系统的 Makefile 。你正常调用 xmkmf 会附加 -a 参数,来自动的做 make Makefiles, make includes,和 make depend 这会定义变量和函数库给编译器和连接器。有时会没有 Imake 文件,可用 INSTALL 或 configure 脚本完成这个单元。提示你运行 configure, 需要这样来调用 ./configure 要确保 configure 脚本在当前目录可访问大部分情况下 README 包括发布和解释安装程序的说明。
通常一个好方法是检查 Makefile 是否是 xmkmf 或其他程序构建的。Makefile 通常能正确检测出你的系统,但有时候需要手动调整它的错误。
安装刚才构建的二进制到适当的系统目录通常以 root 运行 make install 。这个目录一般在现在流行的 Linux 发行版上是 /usr/bin, /usr/X11R6/bin和 /usr/local/bin。新包的首选项是 /usr/local/bin, 以便和 Linux 原始安装的文件区分开来。
最初的商业版的 UNIX 会安装在 /opt 或其他不熟悉的目录上,这很明显会导致一个安装目录不存在的错误。有个简单的方法就是用 root 建立一个 /opt 目录,让包能安装到。并且增加目录到 PATH 的环境变量里。为了兼容,你可以选择创建一个链接到 /usr/local/bin 目录。
你的基本安装步骤如下:
* 读一下 README 文档和其它应用文档。
* 执行 xmkmf -a, 否则用 INSTALL 或 configure script.
* 检查一下Makefile 。
* 如果需要, 执行一下 make clean, make Makefiles, make includes, 和make depend 。
* 运行 make.
* 检查文件的权限.
* 一般都必须要执行一下make install.
提示:
* 你如果没有 root 权限来安装,那么用 su 切换到 root 来安装和编译二进制到系统目录是必须要的。
* 在接下来使用比较合适的 make,你可能需要增加一些选项达到最佳,用标准的 Makefile 传递给 gcc 来编译,Makefil 包括或创建一个包为你安装,一些公开的的选项有 -O2, -fomit-frame-pointer, -funroll-loops, and -mpentium (如果你运行的是Pentium cpu). 在使用这些选项的时候要理解,并小心在 Makefile 中修改最佳参数。
* 然后用 make 创建二进制,你可能要用 strip 。strip 命令能删除来自二进制的调试符号,减少占用的磁盘空间,当然这也关闭了调试信息。
* Pack Distribution Project 提议不同步骤建立的软件包,基于 Python 的脚本工具来管理调试符号,把它们放在不同的单独目录里。这些存档文件是普通的 tarballs, 但它们安装在 /coll 和 /pack 里的目录。你也许要找到它则必须要在上面这个站点 http://sunsite.auc.dk/pack/ 下载 Pack-Collection ,来运行其中发布的一个。

4.1 关于 rpm 的哪些错误?
一些 Linux 用户很显然比较畏惧用源码来手动构建和安装包。不过值得高兴的是现在有流行的 rpm 和 deb 或新格式的 slp 包。虽然当它可能的例子是,rpm 安装正常运行平稳又快作为一个软件安装在某几个有名的操作系统,但还是应该对自安装的预先包装的二进制缺点提出一些思考。
首先,一个正常的软件包发布为 "tarballs",并且这个二进制包发布的今天或几周,几个月后,一个 rpm 包作为为"tarball"的最后版本的镜象发布。所以,你可能要祈祷这个软件作为 rpm 或 deb 早点出现,一些受欢迎的软件可能从来就没有做成 rpm 形势发布。
第二,"tarball" 会更完善,它本身有更多的选项,从而能根据需求定制安装.二进制形势的 rpm 版本可能缺少完全功能的发布版本。rpm的来源发布者如果要制作包含等同于 "tarballs" 的功能,则需要用其中之一的参数选项安装 rpm --recompile packagename.rpm or rpm --rebuild packagename.rpm 。
第三,一些预先做好的二进制包并不能适当的安装,假如安装有可能导致失败并产生 core-dump 。它们有可能需要你系统里不同的依赖关系库,或者并没准备好或者正巧损坏了 。任何时候当安装 rpm 或 deb 你必须无条件的信任制作包的人。
最后,它交给手头的源码去帮助,能从中学习到认为需要的东西。更多易懂的内容需要去你的存档二进制中去了解,而不是来源于 rpm 。
安装一个 rpm 包很容易想到的问题就是,假如安装需要依赖关系则会导致失败。同样,当 rpm 请求你系统中不同版本的库,那么安装将不能继续,除非你为错误的库位置创建连接符号到正确的位置。尽管 rpm 安装很方便,但经常因为错误而导致失败更应该选择 "tarball" 方式来安装。
你必须以 root 安装 rpm 和 deb 。它需要必须的写权限,这会导致可能比较严重的安全漏洞。当你没注意的时候有可能会把系统二进制和库弄得乱七八糟,甚至安装特洛伊木马到系统里。因此获取 rpm和 deb 必须来自 "受信任的源",任何时候你都要运行 '签名检查' (依靠 MD5 来校验)这个安装包, 在安装之前运行 rpm -K --checksig packagename.rpm ,同样吐血推荐运行 rpm -K --nopgp packagename.rpm。ded 包同样的命令是 dpkg -I | --info packagename.deb 和dpkg -e | --control packagename.deb 。
* rpm --checksig gnucash-1.1.23-4.i386.rpm
gnucash-1.1.23-4.i386.rpm: size md5 OK
* rpm -K --nopgp gnucash-1.1.23-4.i386.rpm
gnucash-1.1.23-4.i386.rpm: size md5 OK
有些偏执狂会运行 (并且,在这个例子里有大量这样的偏执狂) unrpm 和 rpmunpack 解压 rpm 包,从这里Sunsite utils/package directory 检查包的可用性。
Klee Diene 有一个写好的实验 dpkgcert 包用来 校验安装的完整性。这些 .deb 依赖 MD5 检查。可到 Debian ftp archive 去下载。当前包名称和版本是 dpkgcert_0.2-4.1_all.deb 。Jim Pick Software 站点维护一个实验服务器数据库,用来提供给 dpkgcert 发证书给典型的 Debian 包安装。.
在它们最简单的形势中,用命令 rpm -i packagename.rpm 和 dpkg --install packagename.deb 会自动解包和安装。练习的时候要小心,这些操作可能会导致系统损坏!
注意上述这些警告同样适用于尽管范围比较小的 Slackware's pkgtool 安装。所有的“自动”安装软件都要小心谨慎。
martian 和 alien程序,允许转换 rpm, deb, Stampede slp, 和 tar.gz 包格式.这可确定能兼容大部分的的 Linux 发行版。
仔细阅读 rpm 和 dpkg 命令的 man pages 并参考 RPM HOWTO ,TFUG 的 Quick Guide to Red Hat's Package Manager ,和 The Debian Package Management Tools 得到更多可用的信息。
4.2 关于 rpm 的麻烦问题:一个例子
Jan Hubicka 写过一个非常棒的软件叫 xaos. 在他的 主页 可下载, 有 .tar.gz 和 rpm 两种形势安装。为了方便,我们现在用 rpm,而不是“tabll” 。
不幸的是,rpm 版本的 xaos 无法安装,两个版本的 rpm 包都不行。
rpm -i --test XaoS-3.0-1.i386.rpm
error: failed dependencies:
libslang.so.0 is needed by XaoS-3.0-1
libpng.so.0 is needed by XaoS-3.0-1
libaa.so.1 is needed by XaoS-3.0-1
rpm -i --test xaos-3.0-8.i386.rpm
error: failed dependencies:
libaa.so.1 is needed by xaos-3.0-8
这奇怪的现象是 libpng.so.0 和 libaa.so.1 在所有的系统测试都在 /usr/libxaos的rpm包构建必须要不同版本的库文件,版本号码必要要一样。
作为测试,我们尝试安装 xaos-3.0-8.i386.rpm 加个 --nodeps 选项强行安装。运行 xaos 出现了错误:
xaos: error in loading shared libraries: xaos: undefined symbol: __fabsl
让我们来尝试底层查明真相。运行ldd 在 xaos 二进制上,来查找它依赖的所有必须的共享库。运行 nm 在 /usr/lib/libaa.so.1 库上,列出它的链接 __fabsl。当然,会出现的提示是来自其他库是损坏的……这将不能完成操作,只能替换其他的库。
够了! 下载一个 "tarball", XaoS-3.0.tar.gz ,可以从 ftp site 站点,或者它的主页下载到。尝试构建它(用 root 身份)运行 make install 。
这个是预先做好的二进制包安装很麻烦的例子之一。
5. Termcap 和 Terminfo 发行
根据它的 man page, " terminfo 是一个描述终端符号的数据库,使用屏幕向导程序……"。它用来在终端显示文本定义一个控制顺序的一般设置 (escape codes) ,并且没有对特别指定的驱动的需要提供尽可能的终端硬件支持。 terminfo 库位于主流的 Linux 发行版的 /usr/share/terminfo 。
terminfo 数据库支持旧的 termcap 和一个完全过时的 termlib 。 除了包需要 termcap ,当处理一个需要的包时,这通常只要是不涉及到程序安装。
大部分 Linux 发行版现在需要使用 terminfo ,但仍然保留旧的termcap 库兼容旧的应用程序 (查看 /etc/termcap)。有时候,一个特殊的兼容包,使用 termcap 链接库安装更顺利。甚至有时一个 #define termcap 声明可能需要一个源文件来注解。检查适当的权威信息发布的细节 doc 文件。
6. 向后兼容 a.out 二进制
在一些较少的案例里,必须使用 a.out 二进制,或因为源代码不可用,否则因此为一些理由构建构来自源的新 ELF 二进制是不可能的。
碰巧,ELF 安装几乎总是有一个/usr/i486-linuxaout/lib 目录里的a.out的完全设置。多个不同的 ELF 数种编码制为 a.out 库,聪明的避免能引起的冲突, a.out 二进制在运行时因此能找到正确的库,但不可能总是这样的情况。
注意需要把 a.out 支持编译内核里,或者作为模块加载。这也许必须重新编译内核才可以。另外一些 Linux 发行版需要专用的兼容包安装,比如 Debian 的可执行 a.out X 应用程序 xcompat 。
6.1 一个例子
在后来几年Jerry Smith 写过一个方便的 rolodex 程序。虽然它使用图形库,但幸运地是也可有效地作为静态链接二进制 a.out 格式,不幸地是,源码需要多个重新使用lesstif 库编译。还有更多地不幸是在一个 ELF 系统上的a.out 二进制炸弹有下面的错误消息:
xrolodex: can't load library '//lib/libX11.so.3'
No such library
正好有这样一个库,在 /usr/i486-linuxaout/lib 里, 但 xrolodex 在运行的时候不能定位它。一个简单的解决方式是提供一个链接符号在 /lib 目录里:
ln -s /usr/i486-linuxaout/lib/X11.so.3.1.0 libX11.so.3
它从头至尾的运转是必须提供 libXt.so.3 和 libc.so.4 libraries 的类似链接。这需要 root 完成,当然,值得注意的是你应该确保完全可靠,你要对现存在的二进制不覆盖或引起版本号冲突。幸运的是,新的 ELF 库有更高版本号,正好是预先想到的这个问题。
接下来创建这三个链接,xrolodex 运行非常好。
xrolodex 包最初在 Spectro 公开,但在那里似乎消失了。它现在作为 tar.Z 源码格式文件 [512k] 从 Sunsite 下载。
假如 xmkmf 和/或者 make 没有错误而通过了,你可能要继续到下一个章节, 无论如何,然而,在 "真实生活"里,很少事情在第一次就操作正确,这样可以测试你的足智多谋了。
7.1 链接错误
假设 make 失败有个链接错误: -lX11: No such file or directory,正好在 xmkmf 之后已被调用,这可能意味着 Imake 不能被完全建立。检查第一部分 Makefile 文件的的行是这样 :
*
LIB= -L/usr/X11/lib
INCLUDE= -I/usr/X11/include/X11
LIBS= -lX11 -lc -lm
这个 -L 和 -I 开关告诉编译器和链接分别在哪里找到 library 和 include 文件。在这个例子里, X11 库应该在 /usr/X11/lib 目录,且 X11 包含文件应该在 /usr/X11/include/X11 目录里。假如对于你的机器上的这个错误,请处理修改 Makefile 并重新再 make。
* 没有声明涉及的数学库函数,像下列各项:
/tmp/cca011551.o(.text+0x11): undefined reference to `cos'
要修复它,需要明确链接到匹配的库,在 Makefile (看先前的例子) 里增加一个 -lm 到 LIB 或 LIBS 标记 。
* 用其他方法尝试 xmkmf 仍然失败 xmkmf 如果失败,参考下列脚本:
make -DUseInstalled -I/usr/X386/lib/X11/config
这个直接方式的类别相当于 xmkmf 。
* 在少数例子里,用 root 运行 ldconfig 可能会解决:
# ldconfig 更新共享库链接符号。这可能不是必须的。
* 一些 Makefiles 使用你系统里未被承认的库别名。一个例子,构建可能需要 libX11.so.6 ,但是在 /usr/X11R6/lib 不存在文件或链接。然而,在那里是 libX11.so.6.1。解决方法是用 root 运行ln -s /usr/X11R6/lib/libX11.so.6.1 /usr/X11R6/lib/libX11.so.6 ,接着需要运行 ldconfig 。
* 有时候源码需要老版本的 X11R5 库来构建。假如你有 R5 libs 在 /usr/X11R6/lib (当首先安装 Linux 的时候,你有过它们的选项),你只需要确定你有链接软件构建。 R5 libs 名字是 libX11.so.3.1.0 , libXaw.so.3.1.0 ,和 libXt.so.3.1.0 。你通常需要链接,就好像 libX11.so.3 -> libX11.so.3.1.0 。这个软件也同样需要一个链接 libX11.so -> libX11.so.3.1.0 。当然,创建一个 "缺少的" 链接,可用 root 运行命令 ln -s libX11.so.3.1.0 libX11.so 。
* 一些包需要你安装一个或更多库的升级版本。一个例子,StarOffice 4.x 版本套件来自 StarDivision GmbH 以需要一个 libc 的5.4.4版本而声名狼藉。更多新的 StarOffice 5.0 以新的 glibc 2.1 libs 不接下来安装。幸运的是,最近更新的 StarOffice 5.1 解决了这些问题。假如你作为 root 要运行老版本的StarOffice ,需要拷贝一个或更多的库到适当的目录里,删除旧的库,重新设置动态链接库(检查StarOffice miniHOWTO 最后一个版本可获取更多信息)。小心: 在此极端的练习,如果你启动后会使你的系统变得不可用。你通常能在 Sunsite. 找到最后更新的库。
7.2 其他问题
* 一个安装的的 Perl 或 shell 脚本给你一个:No such file or directory 的错误消息。在这个事例中,检查文件权限确定文件事可执行的,并检查文件头确定是否 shell 或程序是脚本在指定的位置被调用。一个例子,这个脚本可能是这样开始的:
#!/usr/local/bin/perl
如 Perl 的实际安装位置是在你的 /usr/bin 目录,用一个 /usr/local/bin 替代,这个脚本不能运行有两个方法来纠正。文件头改成 #!/usr/bin/perl, ,或增加一个链接符, ln -s /usr/bin/perl /usr/local/bin/perl 。
* 一些 X11 软件需要图形库来构建。标准的 Linux 发行版没有安装图形库,而且图形库的使用需要额外 $100 至 $200 的价格。 (尽管大多数的自由软件 Lesstif 同样也能操作)。假如你需要图形库构建一个某几个包,但是缺乏图形库,它可能包含静态链接库。静态链接编译可把库包含在二进制本身。虽然这个会导致很多大量的二进制文件,但代码将涉及系统缺乏的库。
当一个包构建需要的库不在你的系统里,它将产生一个链接错误(没声明涉及错误)。这个库可能是专有或找到其他原因是困难的。在这个事例里,获得一个包的作者的静态链接库 或从来自一个 Linux 使用团体可能是最容易的实现修复的两种方法。
* 运行 configure 脚本创建一个未知的 Makefile ,你尝试构建一个表面不相干的包,运行 configure 是错误的方法,这样会在你的 PATH 中找到另外一个,始终都要这样调用 ./configure 来防止错误发生。
* 大部分 Linux 发行版从老的 libc 5 改成 libc 6 / glibc 2 库。早期存在的的二进制工作在老的库上,你升级你的库后会导致它们失败。解决方法是用源码重新编译应用程序或获取最新的二进制。假如你升级系统到新的 libc 6 过程或经历了错误,查阅 Eric Green 的 Glibc 2 HOWTO 。
注意glibc 版本有一些不同,所以一个二进制在 glibc 2.1 构建的,可能不能用glibc 2.0 代替而工作。
* 有时候必须在 Makefile 的编译标记移除 ansi 选项 。这会激活 gcc 额外的 non-ANSI 特征,并允许构建包需要的范围。 (感谢 Sebastien Blondeel 从头至尾的指点)。
* 一些程序需要有 root 的 setuid ,在 root 特权下运行。这个命令可以实现 chmod u+s filename, (提示这个程序必的属主须已经是 root)。 这个设置 setuid 位的结果在文件权限里。当程序访问系统硬件的,比如调制解调器或光驱,或 SVGA libs 从控制台模式调用,在一个独特热门的包已经发布了讨论。假如一个程序用 root 运行,但是出现 access denied 的错误消息给一个普通用户,那可以猜想到引起的这个原因。
警告: 一个程序 root 的 setuid 可能会给你的系统造成一个安全问题。这个程序运行有 root 权限且因而存在潜在的损害。确保你知道什么程序这样做可靠,在设置 setuid 位之前尽可能查看源码。
7.3 细节调试优化
你可能希望调查 Makefile 为你的系统调用的某些最佳编译选项。一个例子,设置 -O2 标记选择优化的最高级别和 -fomit-frame-pointer 标记来制作最小的二进制(尽管调试没被关闭)。除非你知道你正在做的,否则在任何时候,无论如何不要尝试去构建 试验的操作。
7.4 什么地方可得到进一步帮助
在我的经验里, 25% 以上的应用程序构建"完全没有问题"。另外的50% 在经过努力修正细节能被 "劝说" 的构建。这个包的重要数字表示仍然意味着有不能完全成功被构建。即使这样, 这些 Intel ELF 和/或 a.out 二进制也可能在 Sunsite 和 TSX-11 archiv 找到。 Red Hat 和 Debian 有大量的大多数流行的Linux 软件,作为预先编译好的二进制存档。或许软件的作者能提供为你特殊机器编译的二进制。
注意如果你获取编译好的二进制,你需要检查是否和你的系统兼容:
* 二进制能在你的硬件上运行(也就是 Intel x86)。
* 二进制必须和你的内核兼容(也就是 a.out 或 ELF)。
* 你的函数库必须是很新的。
* 你的系统必须能适当有效安装(rpm 或 deb)。
假如所有的都失败了,你可能要在合适的新闻组去寻找帮助,比如 comp.os.linux.x 或 comp.os.linux.development 。
如果所有的操作都没问题,至少在它上面花费最大的努力,而且你学到了很多。
8. 最后的步骤
阅读软件包文档决定是否某几个环境变量需要设置(在 .bashrc 或 .cshrc 里) ,以及如果 .Xdefaults 和 .Xresources 文件需要定制。
可能有一个应用程序默认文件,在最初发布的 Xfoo 里,一般叫做 Xfoo.ad。 假如是这样,编辑 Xfoo.ad 为你的机器定制,以 root 身份重命名(mv) Xfoo 并安装它到 /usr/lib/X11/app-defaults 目录。不这样着可能会使软件运行异常而失败或更本不能运行。
大部分的软件包有一个或更多的 man pages 。作为 root 拷贝 Xfoo.man 文件到适当的目录 /usr/man, /usr/local/man, 或 /usr/X11R6/man (man1 - man9),并因此重命名它。一个例子,如果 Xfoo.man 最后在 /usr/man/man4 目录,它应该被重命名为 Xfoo.4 (mv Xfoo.man Xfoo.4)。按照惯例,man1 是使用命令,游戏在 man6 ,管理工具在 man8 (查看man 文档获取更多细节) ,当然,如果你愿意也可以在你的系统上不按照这个规定做。
一些软件包不安装二进制到合适的目录里,它们在 Makefile 里没用install 选项。你应该以 root 身份手动拷贝二进制到合适的系统目录, /usr/bin, /usr/local/bin 或 /usr/X11R6/bin 。当然,注意 /usr/local/bin 是二进制首选的目录,这不是 Linux 发行版的最佳安装部分。
一些或所有上述程序,在大部分案例,应该是用make install, 来自动操作,并尽可能用 make install.man 或 make install_man. 如果这样,请阅读 README 或 INSTALL 文档将详细说明这个情况。
Matt Chapman 的 Xscrabble 似乎是有趣的一个程序。因为我正好希望做 ScrabbleTM 的玩家。我下载了它,并根据 README 文件用以下步骤构建它:
xmkmf
make Makefiles
make includes
make
当然它不能工作...
gcc -o xscrab -O2 -O -L/usr/X11R6/lib
init.o xinit.o misc.o moves.o cmove.o main.o xutils.o mess.o popup.o
widgets.o display.o user.o CircPerc.o
-lXaw -lXmu -lXExExt -lXext -lX11 -lXt -lSM -lICE -lXExExt -lXext -lX11
-lXpm -L../Xc -lXc
BarGraf.o(.text+0xe7): undefined reference to `XtAddConverter'
BarGraf.o(.text+0x29a): undefined reference to `XSetClipMask'
BarGraf.o(.text+0x2ff): undefined reference to `XSetClipRectangles'
BarGraf.o(.text+0x375): undefined reference to `XDrawString'
BarGraf.o(.text+0x3e7): undefined reference to `XDrawLine'
etc.
etc.
etc...
我在有关这个的 comp.os.linux.x 新闻组上询问,有人善意并直接的提出显然是 Xt, Xaw, Xmu, 和 X11 libs 函数库在链接的位置没有找到。
那里有两个主要的 Makefiles ,一个在 src 目录引起了我的注意,在 Makefile 里的一行定义的 LOCAL_LIBS 是 LOCAL_LIBS = $(XAWLIB) $(XMULIB) $(XTOOLLIB) $(XLIB) ,在这里提到的函数库不能被链接到。
查看下一个涉及到的 LOCAL_LIBS,我看了Makefile 的第 495 行:
$(CCLINK) -o $@ $(LDOPTIONS) $(OBJS) $(LOCAL_LIBS) $(LDLIBS)
$(EXTRA_LOAD_FLAGS)
现在这些 LDLIBS 是什么?
LDLIBS = $(LDPOSTLIB) $(THREADS_LIBS) $(SYS_LIBRARIES)
$(EXTRA_LIBRARIES)
SYS_LIBRARIES 是:
SYS_LIBRARIES = -lXpm -L../Xc -lXc
对!这里是缺少的函数库。
或者这个链接需要在 在看 LDLIBS 之前的 LOCAL_LIBS……那么,首先认为尝试在 Makefile 修改 $(LOCAL_LIBS) 和 $(LDLIBS) ,替换第 495 行,因此现在应该阅读:
$(CCLINK) -o $@ $(LDOPTIONS) $(OBJS) $(LDLIBS) $(LOCAL_LIBS)
$(EXTRA_LOAD_FLAGS) ^^^^^^^^^^^^^^^^^^^^^^^
我经过上述的修改试验后再次运行 make ,看!它已经工作了。当然, Xscrabble 仍然需要更好的调试,比如在源码文件里重命名关键字和注释一些声明。从那以后它给了我很多愉快的时光。
[提示有最近的 Xscrabble 版本现在有了可用的 rpm 格式,而且安装没有任何问题。]
你可以用 e-mail 发给 Matt Chapman, ,而且它的 主页. 可提供 Xscrabble 的下载。
Scrabble 是 Milton Bradley 有限公司的注册商标。
10. 第二个例子:Xloadimage
这个例子展现一个简单的问题。xloadimage 程序对我的图形工具的调整设置是有用的附加。我从源码目录拷贝文件,在 CD 上包括有非常好的 Mui 和 Quercia 写的X User Tools 书籍。用 tar xzvf 解压文件,可是在运行 make 的时候出现令人讨厌的错误并停止了。
gcc -c -O -fstrength-reduce -finline-functions -fforce-mem
-fforce-addr -DSYSV -I/usr/X11R6/include
-DSYSPATHFILE=\"/usr/lib/X11/Xloadimage\" mcidas.c
In file included from /usr/include/stdlib.h:32,
from image.h:23,
from xloadimage.h:15,
from mcidas.c:7:
/usr/lib/gcc-lib/i486-linux/2.6.3/include/stddef.h:215:
conflicting types for `wchar_t'
/usr/X11R6/include/X11/Xlib.h:74: previous declaration of
`wchar_t'
make[1]: *** [mcidas.o] Error 1
make[1]: Leaving directory
`/home/thegrendel/tst/xloadimage.4.1'
make: *** [default] Error 2
这个错误消息包含了实质的线索:
查看 image.h 文件的 23 行:
#include <stdlib.h>
啊哈,在 源码的某处对于 xloadimage, wchar_t 已经在指定标准 include 文件重新定义。 告诉我们首先在 image.h 的 23 行尝试注释它,或许 stdlib.h include 是不存在的,毕竟不是所有都是必需的。
在这点,构建中的收益来源于所有任何一个致命错误。xloadimage 现在功能正常。
11. 第三个例子:Fortune
这个例子需要一些 C 语言知识。大部分 UNIX/Linux 软件是用 C 写的。而且任何人学习少量的 C 知识对于软件安装是非常有好处的。
非常有名的 fortune 软件在每次 Linux 启动的时候显示幽默语句 "fortune cookie"。不幸的是 (有意的双关), 尝试在 Red Hat 2.0.30内核的发行版上构建会产生一个重大错误。
~/fortune# make all
gcc -O2 -Wall -fomit-frame-pointer -pipe -c fortune.c -o
fortune.o
fortune.c: In function `add_dir':
fortune.c:551: structure has no member named `d_namlen'
fortune.c:553: structure has no member named `d_namlen'
make[1]: *** [fortune.o] Error 1
make[1]: Leaving directory `/home/thegrendel/for/fortune/fortune'
make: *** [fortune-bin] Error 2
参看 fortune.c 有关的行在这里:
if (dirent->d_namlen == 0)
continue;
name = copy(dirent->d_name, dirent->d_namlen);
我们需要在 dirent 结构里寻找,但是它没有所说的 fortune.c 文件,在其它所有源码文件里用 grep dirent 命令也没看到。可是在 fortune.c 最上面有下面的行:
#include <dirent.h>
这看起来似乎是一个系统函数 include 文件,那么这个逻辑路径真的存在吗?在 /usr/include 目录里找到 dirent.h 文件,但是这个文件不包含 dirent 结构声明 。在那里提到的应该是是另一个 dirent.h 文件。
#include <linux/dirent.h>
最后,找到了 /usr/include/linux/dirent.h 文件,我们找到需要的结构声明。
struct dirent {
long d_ino;
__kernel_off_t d_off;
unsigned short d_reclen;
char d_name[256]; /* We must not include
limits.h! */
};
足以确定,结构声明中没包含 d_namelen ,但是两个“候选人”都相同。最有可能的是 d_reclen 。因为这个结构成员出现的特征或许和它的大概长度是一个短整数。另一个可能性,d_ino ,凭它的名字和类型判断可能是一个节点数字。事实上,我们正在处理一个 "directory entry"; 结构,而且这些元素表现一个文件的属性,它的名字,节点,和长度 (在区段中) 。这些似乎证实了我们的猜测。
让我们编辑 fortune.c 文件,并在 551 和 553 行修改两个 d_namelen 为 d_reclen 。再重新 make all aga 。成功。 它构建没有错误。我们现在从好运气中得到我们的"cheap thrills" 。
这是以个很久以前的老游戏, 是 Bob Ankeney 在 80 年代的时候为 UNIX 写的, Mike Yang 在 1992 年修正过。现在是 Jonathan Badger 在维护它。它最初是美国俄勒冈州软件的 Don Backus 用更古老的 Pascal 程序写的,最后是 Jeff Hemmerling 更新。最初作为多个玩家客户端一起参加,也可以作为单打模式和电脑对抗。它的画面非常精美,虽然这个游戏缺乏诡辩难度的特点,而且电脑玩家不是很厉害。所有上述的,它似乎是过去 UNIX 和 Linux 机器一个古来、正规的游戏。
由于它的年龄和血统,这一个包特别地难以在一个 Linux 系统上构建。 它需要解决一个很长的一系列复杂的难题。它是耐心和决心的一种锻炼。
开始之前确定某个已经安装了必须的图形库。
*
xmkmf
make
client.c: In function `read_card':
client.c:430: `_tty' undeclared (first use in this function)
client.c:430: (Each undeclared identifier is reported only once
client.c:430: for each function it appears in.)
client.c: In function `scan':
client.c:685: `_tty' undeclared (first use in this function)
make: *** [client.o] Error 1
这个原因在 client.c 文件:
#ifndef SYSV
(buf[2] != _tty.sg_erase) && (buf[2] != _tty.sg_kill)) {
#else
(buf[2] != CERASE) && (buf[2] != CKILL)) {
#endif
*
在 client.c ,增加
#define SYSV
在 39 行,是通过上述提到的 _tty.
make
client.c:41: sys/termio.h: No such file or directory
make: *** [client.o] Error 1
*
这个 include 文件 termio.h 在一个 Linux 系统的 /usr/include 目录。 应当在 /usr/include/sys 更适合,这个案例是一个很老的 UNIX 机器。因此修改 client.c 的 41 行:
#include <sys/termio.h>
修改为
#include <termio.h>
make
gcc -o hearts -g -L/usr/X11R6/lib client.o hearts.o select.o connect.o
sockio.o start_dist.o -lcurses -ltermlib
/usr/bin/ld: cannot open -ltermlib: No such file or directory
collect2: ld returned 1 exit status
make: *** [hearts] Error 1
*
现流行的 Linux 发行版使用 terminfo 和/或 termcap 数据库,比这个 termlib 更适合:
编辑 Makefile.
第 655 行:
CURSES_LIBRARIES = -lcurses -ltermlib
修改为
CURSES_LIBRARIES = -lcurses -ltermcap
make
gcc -o xmhearts -g -L/usr/X11R6/lib xmclient.o hearts.o select.o
connect.o sockio.o start_dist.o gfx.o -lXm_s -lXt -lSM -lICE -lXext -lX11
-lPW
/usr/bin/ld: cannot open -lXm_s: No such file or directory
collect2: ld returned 1 exit status
主要缺少的 lesstif 函数库是libXm ,相当于 libXm_s 。因此编辑 Makefile :
在 653 行:
XMLIB = -lXm_s $(XTOOLLIB) $(XLIB) -lPW
修改为
XMLIB = -lXm $(XTOOLLIB) $(XLIB) -lPW
make
gcc -o xmhearts -g -L/usr/X11R6/lib xmclient.o hearts.o select.o
connect.o sockio.o start_dist.o gfx.o -lXm -lXt -lSM -lICE -lXext -lX11 -lPW
/usr/bin/ld: cannot open -lPW: No such file or directory
collect2: ld returned 1 exit status
make: *** [xmhearts] Error 1
*
这个通常是不可信的.
这儿没有 PW 库文件。编辑 Makefile :
第 653 行::
XMLIB = -lXm $(XTOOLLIB) $(XLIB) -lPW
修改为:
XMLIB = -lXm $(XTOOLLIB) $(XLIB) -lPEX5
(PEX5 库受到的影响最接近到 PW 。)
make
rm -f xmhearts
gcc -o xmhearts -g -L/usr/X11R6/lib xmclient.o hearts.o select.o
connect.o sockio.o start_dist.o gfx.o -lXm -lXt -lSM -lICE -lXext -lX11 -lPEX5
最终运转正常 (万岁!)。
*
安装:
切换为 root :
[root@localhost hearts]# make install
install -c -s hearts /usr/X11R6/bin/hearts
install -c -s xmhearts /usr/X11R6/bin/xmhearts
install -c -s xawhearts /usr/X11R6/bin/xawhearts
install in . done
*
测试运行:
rehash
(我们运行的是 tcsh shell.)
xmhearts
localhost:~/% xmhearts
Can't invoke distributor!
*
从源码包里阅读 README 文件:
Put heartsd, hearts_dist, and hearts.instr in the HEARTSLIB
directory defined in local.h and make them world-accessible.
在 local.h 文件的内容如下:
/* where the distributor, dealer and instructions live */
#define HEARTSLIB "/usr/local/lib/hearts"
这是 RTFM 的一流案例:
切换成 root
cd /usr/local/lib
mkdir hearts
cd !$
拷贝目标文件到这个目录
cp /home/username/hearts/heartsd .
cp /home/username/hearts/hearts_dist .
cp /home/username/hearts/hearts.instr .
*
用其他用户测试运行
xmhearts
它运转了一些时间,但大部分时候没有出现失败的消息。
*
这个"distributor" 和 "dealer" 扫描硬件端口,我们应该因此猜想那些程序需要 root 特权。
尝试一下,切换到 root
chmod u+s /usr/local/lib/heartsd
chmod u+s /usr/local/lib/hearts_dist
(注意这里,象先前的讨论,suid 二进制可能会导致安全漏洞。)
xmhearts
它最终工作正常!
Hearts 在 Sunsite 可以下载得到。
13. 第五个例子:XmDipmon
Bullwinkle: 嗨!Rocky ,注意啦,我要从我的帽子里拉出一直兔子。
Rocky: 但这个是骗局从没操作过。
Bullwinkle: 这个时间绝对有把握。
快节奏音乐!
很好,我获得结束了.
Rocky: 并且现在它的时间给其他指定的特写。
--- "Rocky 和它的朋友"
XmDipmon 是以个漂亮小巧的应用程序,它为一个按钮的样子来显示 Internet 连接。当连接中断它会闪光和发出声音。经常是这些所有的案例在乡下的电话系统。不幸的是, XmDipmon 操作仅有 dip ,使用它的那些人多数是用来使用 chat (译注:聊天程序)连接。.
构建 XmDipmon 是没问题的。 XmDipmon 链接到 Motif 库,但是它要有 Lesstif 来构建和运转才能良好。这个挑战是修改包的工作,当使用 chat ,这个实际上是要修改源代码 ,并必要地需要一些程序开发知识。
"当 xmdipmon 启动,它检查一个文件是 /etc/dip.pid
(你能让它看其他文件使用 -pidfile 命令行选项
)。 这个文件包含 dip 后台进程的 PID (dip 转换它自己到后台模式一次,它有个确定的连接)。"
--- 来自 XmDipmon 的 README 文件
使用 -pidfile 选项,这个程序启动后能定向到不同的文件检查,只有这个文件存在的时候能成功 chat 登陆。 很明显这个是 modem 开关锁文件。我们应该因此尝试调用 xmdipmon -pidfile /var/lock/LCK..ttyS3 (这里假设 modem 在 com 端口#4, ttyS3)。尽管这个只解决部分问题。这个程序不断监控 dip 后台进程,并且我们需要修改它用 chat 或 ppp 代替处理。
在那里只有以个源码文件,但幸运的是它有很好的注释。阅读 xmdipmon.c 文件,我们找到 getProcFile 函数,标题描述如下:
/*****
* Name: getProcFile
* Return Type: Boolean
* Description: tries to open the /proc entry as read from the dip pid file.
<snip>
*****/
我们追踪到这里很激动。继续追踪到函数部分...
/* we watch the status of the real dip deamon */
sprintf(buf, "/proc/%i/status", pid);
procfile = (String)XtMalloc(strlen(buf)*sizeof(char)+1);
strcpy(procfile, buf);
procfile[strlen(buf)] = '\0';
找到所需的在 2383 行:
sprintf(buf, "/proc/%i/status", pid);
^^^^^^^^^^^^^^^^^^^^^
这个检查看是否 dip 后台程序运行。那么,我们要怎么改变它代替监控 pppd
查看 pppd manpage:
FILES
/var/run/pppn.pid (BSD or Linux), /etc/ppp/pppn.pid (others)
Process-ID for pppd process on ppp interface unit n.
修改 xmdipmon.c 第 2383 行为:
sprintf(buf, "/var/run/ppp0.pid" );
重新构建这个包,没任何问题。现在用新的命令行参数测试它。它工作看起来好极了。这个小的蓝色按钮显示当一个 ppp 连接到 ISP 并确定,当连接中断会闪光和发出声音。现在我们有以个完全功能的 chat 监控。
XmDipmon 能在 Ripley Linux Tools 下载。
现在你渴望用你新获取的知识来增加有用的和其他的到你的系统。你可能要从在线的 Linux Applications and Utilities Page 或 Red Hat, InfoMagic, Linux Systems Labs, Cheap Bytes 和其他的 CD ROM 获取存档文件。
一个全面的源代码知识库是 comp sources UNIX archive 。
大量 UNIX 源代码 alt.sources 新闻组出现。如果你要着特殊的源代码包,你可能要在 alt.sources.wanted 新闻组张贴一些描述。另外一个好地方是检查 comp.os.linux.announce 新闻组。能从这里得到 Unix sources 邮件列表,到这里发送一个订阅消息。
alt.sources 新闻组的存档文件在下面的 ftp 站点:
* ftp.sterling.com/usenet/alt.sources/
* wuarchive.wustl.edu/usenet/alt.sources/articles
* src.doc.ic.ac.uk/usenet/alt.sources/articles
15. 最后的操作
做下总结,坚持处理所有的差异(而且一个严重的挫折的确对自己有用)。努力学习,从错误里去仔细研究。从每个不足甚至失败的扩充到知识部分能引导掌握 构建软件的技巧。
16. 参考并更深层次阅读
BORLAND C++ TOOLS AND UTILITIES GUIDE, Borland International, 1992,
pp. 9-42.
[手册以 Borland C++, ver. 3.1 发布。给了对语法和介绍很公正的好介绍。为 DOS 使用 Borland 的 削弱执行。]
DuBois, Paul: SOFTWARE PORTABILITY WITH IMAKE, O'Reilly and Associates,
1996, ISBN 1-56592-226-3.
[这是有名的权威涉及 imake ,尽管我写这文章的时候没有到它。]
Frisch, Aeleen: ESSENTIAL SYSTEM ADMINISTRATION (2nd ed.), O'Reilly and
Associates, 1995, ISBN 1-56592-127-5.
[这是其他方面极好的系统管理指导手册,仅粗略覆盖了软件构建。]
Hekman, Jessica: LINUX IN A NUTSHELL, O'Reilly and Associates, 1997, ISBN
1-56592-167-4.
[非常好的全面 Linux 命令参考。]
Lehey, Greg: PORTING UNIX SOFTWARE, O'Reilly and Associates, 1995, ISBN
1-56592-126-7.
Mayer, Herbert G.: ADVANCED C PROGRAMMING ON THE IBM PC, Windcrest Books,
1989, ISBN 0-8306-9363-7.
[一个充满好点子的书,给高级程序员。很好的覆盖了算法、语言代码的奇怪之处,甚至是娱乐方面,不幸的是现在不出版了]
Mui, Linda and Valerie Quercia: X USER TOOLS, O'Reilly and Associates,
1994, ISBN 1-56592-019-8, pp. 734-760.
Oram, Andrew and Steve Talbott: MANAGING PROJECTS WITH MAKE, O'Reilly
and Associates, 1991, ISBN 0-937175-90-0.
Peek, Jerry and Tim O'Reilly and Mike Loukides: UNIX POWER TOOLS,
O'Reilly and Associates / Random House, 1997, ISBN 1-56592-260-3.
[一个点子的令人惊奇的来源,和大量对你可能有效从源码到最终构建的知识。使用方法在这个章节。]
Stallman, Richard M. and Roland McGrath: GNU MAKE, Free Software
Foundation, 1995, ISBN 1-882114-78-7.
[必读。]
Waite, Mitchell, Stephen Prata, and Donald Martin: C PRIMER PLUS, Waite Group
Press, ISBN 0-672-22090-3,.
[大概这是最好的介绍 C 程序开放的入门读物,全面广泛覆盖了入门知识。最新版本现在有效。]
Welsh, Matt and Lar Kaufman: RUNNING LINUX, O'Reilly and Associates,
1996, ISBN 1-56592-151-8.
[仍然是很好的全面 Linux 参考,尽管在一些范围缺乏深度。]
dpkg, gcc, gzip, imake, ldconfig, ldd, make, nm, patch,
rpm, shar, strip, tar, termcap, terminfo, 和 xmkmf 的 man pages
David Fetter 写的 BZIP2 HOWTO 。
Eric Green 写的 Glibc2 HOWTO 。
Daniel Barlow 写的 LINUX ELF HOWTO 。
Donnie Barnes 写的 RPM HOWTO 。
Matthew Borowski 写的 StarOffice miniHOWTO 。
[这些 HOWTOs 应该在你系统的 /usr/doc/HOWTO 或 /usr/doc/HOWTO/mini 目录。更新的版本在 LDP 站点 有 text, HTML, SGML 格式,并通常来自各个作者的主页。]
17. 荣誉
此 HOWTO 的作者真挚的为了他们的帮助意见、修正和鼓励感谢下面的人:
* R. Brock Lynn
* Michael Jenner
* Fabrizio Stefani
荣誉同样送给翻译这 HOWTO 为意大利和日本的好人。(译注:汗颜啊!)
并且,当然要感谢、赞扬、祝福并 hosannahs(译注:赞美上帝的话) Linux Documentation Project(译注:Linux 文档项目组是一个大量收集整理各类技术文档的组织) 的 Greg Hankins 和 Tim Bynum ,让所有的这些可能发生的制作完成。
最后放弃了……
1. 虚拟机
2. MinGW -- 提供一个编译环境,可以把Linux的代码编译成Windows的原生代码
3. Cygwin,这个偶已经8用了。。。。。。同样提供一个Linux环境,可以用来编译Linux代码,但不是Windows原生的。
欢迎补充