项目要交叉编译一个依赖 openssl 的模块,链接阶段报 undefined reference to deflate,一看就是没找到 zlib。服务器上其实装过,版本太老,干脆自己编一份。
源码在 zlib.net 上,文件名类似 zlib-1.3.1.tar.gz,几百 KB,比很多库都小。解压进目录就能开始。
Linux 下的标准三步
./configure --prefix=/usr/local/zlib跑完会生成 Makefile,顺手看一眼输出里有没有编译器检测失败。prefix 别用默认的 /usr/local,装到独立目录,以后想换版本直接换路径,不会和系统自带的那份打架。
make test编译完先跑测试,它会把自带的例子过一遍,压缩解压都对得上再装。这一步三十秒,能省掉后面排查链接错误的两小时。测试通过再 make install。
装完编译器还是找不到
- 头文件在 prefix 下的 include,库在 lib,编译时要加 -I 和 -L,链接加 -lz。
- 运行时找不到 so,把库目录写进 ld.so.conf 再 ldconfig,或者临时设 LD_LIBRARY_PATH。
- 系统里两份 zlib 共存时,用 pkg-config 的 cflags 和 libs 确认取的到底是哪一份。
Windows 上编译
源码包里带了 win32 目录,里面有现成的 Makefile。装了 Visual Studio 的话,开对应的命令行窗口,进去执行 nmake 加 Makefile.msc 就能出动态库和静态库。用 CMake 也行,顶层已经带了 CMakeLists.txt,生成工程再编译,省得配环境。
版本别乱跳。zlib 的接口一直很稳,1.2 升到 1.3 一般不用改代码,但和某些老库混用时仍可能撞符号,出问题先确认两边链的是不是同一份,路径和版本号对一遍。
要把它编成静态库再链进自己的 so,编译参数得带 -fPIC,否则报 relocation R_X86_64_PC32 against symbol 之类的错误,看着像链接器坏了,其实是位置无关代码没开。