数字营销 · Web开发 · 基础设施

Linux中用编译的Zlib库替换系统自带的

记录在 CentOS 5.8 中编译安装 zlib,并替换系统自带 zlib 的完整过程及注意事项。

环境:

CentOS 5.8 64位

系统自带 zlib:

1.2.1

安装版本:

1.2.3

这段时间在重新编译 LNMP,发现 Linux 中很多软件对 zlib 的依赖都比较大,但是系统中安装的 zlib 版本普遍比较低。如果使用 yum 直接升级,那么在安装 Nginx 的时候又没有办法方便地指定 zlib 的目录,所以最终还是需要编译安装 zlib。但是,如果只是单独编译安装一套新的 zlib,而系统中原来的版本还存在,很多程序依然可能继续使用系统自带的库。因此,如果能够直接把系统中已经安装的 zlib 替换掉,应该是比较理想的方案。不过,在编译过程中,很多系统工具本身也依赖 zlib,所以这个替换过程中的顺序非常重要。

下面是我在没有什么参考资料的情况下,自己尝试了差不多一天之后总结出来的经验。

1、下载并解压 zlib

首先下载 zlib 1.2.3,然后解压到:

/usr/local/src/

2、查看系统中 zlib 的安装位置

可以使用:

rpm -ql zlib

查看系统中 zlib 安装的文件。

通过查看可以发现,相关库文件位于:

/lib64/

3、配置 zlib

进入 zlib 的源码目录,执行:

./configure --prefix=/usr/local/zlib/

也可以加上:

--libdir=/lib64/

直接指定库文件的安装位置。

这里为了方便以后管理,我选择把所有文件统一安装到:

/usr/local/zlib/

目录下。

4、编译 zlib

使用:

make

进行编译。

这里需要特别注意一个问题:

这个时候不要急着卸载系统自带的 zlib。

因为当前系统中的一些程序,包括编译过程中需要使用的工具,仍然依赖原来的 zlib。

如果这个时候就把系统自带的 zlib 删除,后面的编译过程可能会直接失败。

5、卸载系统原来的 zlib

等 zlib 已经成功编译完成之后,再卸载系统中的旧版本:

rpm -e--nodeps zlib

卸载完成后,可以查看:

/lib64/

目录。

这时候会发现原来的 libz.so*

库文件已经没有了。

这个步骤的顺序非常重要。如果前面卸载得太早,那么在编译 zlib 的过程中就可能因为缺少系统库而失败。

6、安装编译好的 zlib

接下来执行:

make install

将刚刚编译好的 zlib 安装到系统中。

安装完成之后,可以在:

/usr/local/zlib/

目录下面看到一个 lib 目录,里面存放的就是 zlib 的库文件。

7、注册新的共享库

这时候如果直接运行 yum 等系统工具,可能会提示找不到:

libz.so*

这是因为虽然新的库文件已经安装到了:

/usr/local/zlib/lib/

但是系统还不知道应该到这个目录去寻找共享库。

所以需要修改:

/etc/ld.so.conf

在文件下面增加一行:

/usr/local/zlib/lib/

保存退出。

8、更新共享库缓存

然后执行:

ldconfig

重新更新系统的共享库缓存。

这时候再运行 yum 等工具,发现已经可以正常运行了。

至此,zlib 的替换就完成了。

整个过程大致可以总结为:

下载并解压
查看系统 zlib
配置并编译新 zlib
卸载旧 zlib
安装新 zlib
配置 ld.so.conf
执行 ldconfig
完成替换

这里最关键的一点就是:

先编译,再卸载,最后安装。

如果顺序错误,很容易导致系统中的其他工具无法正常运行。

另外注意一下,zlib现在的最高版本是 1.2.8,但是如果在 CentOS 5.* 中安装大于 1.2.3 的版本,会出现一些错误,上一篇博客已有讲到,这里不再重复。

评论0

欢迎分享你的看法,也欢迎补充不同的实践经验。