Cross Compile zlib

许多程序都要使用zlib,以前我就因为编译别的软件的需要,交叉编译过zlib,当时没注意,现在回过来认真记一下。
首先看看什么是zlib。

zlib是用于资料压缩的函式库,由Jean-loup Gailly与Mark Adler所开发,使用抽象化的DEFLATE压缩算法gzip文件压缩程序。初版0.9版在1995年5月1日发表,最初是为libpng函式库所写 的,后来普遍为许多软件所使用。此函式库为自由软件,使用zlib授权。截至2007年3月,zlib是包含在Coverity的美国国土安全部赞助者选 择继续审查的开源项目。

功能

    * 数据头(header) - zlib能使用一个gzip数据头,zlib数据头或者不使用数据头压缩数据。

通常情况下,数据压缩使用zlib数据头,因为这提供错误数据检测。当数据不使用数据头写入时,结果是没有任何错误检测的原始DEFLATE数据,解压缩软件的调用者知道压缩数据在什么地方结束。

gzip数据头比zlib数据头要大,因为它保存了文件名和其他文件系统信息,事实上这是广泛使用的gzip文件的数据头格式。注意zlib函式库本身不能创建一个gzip文件,但是它可以相当轻松地把压缩数据写入到一个有gzip文件头的文件中。

    * 算法 - 目前zlib仅支持一个LZ77的变种算法,DEFLATE的算法。

这个算法使用很少的系统资源,对各种数据提供很好的压缩效果。这也是在ZIP档案中无一例外的使用这个算法。(尽管zip文件格式也支持几种其他的算法)。

看起来zlib格式将不会被扩展使用任何其他算法,尽管数据头可以有这种可能性。

    * 使用资源 - 函式库提供了对处理器和内存使用控制的能力

不同的压缩级别数值可以指示不同的压缩执行速度。

还有内存控制管理的功能。这在一些诸如嵌入式系统这样内存有限制的环境中是有用的。

    * 策略 - 压缩可以针对特定类型的数据进行优化

如果你总是使用zlib库压缩压缩特定类型的数据,那么可以使用有针对性的策略可以提高压缩效率和性能。例如,如果你的数据包含很长的重复数据,那么可以用RLE(运行长度编码)策略,可能会有更好的结果。

对于一般的数据,默认的策略是首选。

    * 错误处理 - 错误可以被发现和跳过

数据混乱可以被检测(只要数据和zlib或者gzip数据头一起被写入-参见上面)

此外,如果全刷新点(full-flush points)被写入到压缩后的数据流中,那么错误数据是可以被跳过的,并且解压缩将重新同步到下个全刷新点。(错误数据的无错恢复被提供)。全刷新点技 术对于在不可靠的通道上的大数据流是很有用的,一些过去的数据丢失是不重要的(例如多媒体数据),但是建立太多的全刷新点会极大的影响速度和压缩。

    * 数据长度 - 对于压缩和解压缩,没有数据长度的限制

重复调用库函数允许处理无限的数据块。一些辅助代码(计数变量)可能会溢出,但是不影响实际的压缩和解压缩。

当压缩一个长(无限)数据流时,最好写入全刷新点。



使用zlib的软件

今天,zlib是一种事实上的业界标准,以至于在标准文档中,zlib和DEFLATE常常互换使用。数以千计的应用程序直接或间接依靠zlib压缩函式库,包括:

    * Linux核心:使用zlib以实作网络协定的压缩、档案系统的压缩以及开机时解压缩自身的核心。
    * libpng,用于PNG图形格式的一个实现,对bitmap数据规定了DEFLATE作为流压缩方法。
    * Apache:使用zlib实作http 1.1。
    * OpenSSH、OpenSSL:以zlib达到最佳化加密网络传输。
    * FFmpeg:以zlib读写Matroska等以DEFLATE算法压缩的多媒体串流格式。
    * rsync:以zlib最佳化远端同步时的传输。
    * dpkg及RPM package manager
    * Subversion 、Git和 CVS 版本控制 系统,使用zlib来压缩和远端仓库的通讯流量。
    * dpkg和RPM等包管理软件:以zlib解压缩RPM或者其他封包。

因为其代码的可移植性,宽松的许可以及较小的内存占用,zlib在许多嵌入式设备中也有应用。

以上资料来源于 维基百科 :http://zh.wikipedia.org/wiki/Zlib


还有一篇是介绍zlib编程的: 《Linux程式设计入门 - zlib的运用》也是值得一看。

介绍完了zlib,开始交叉编译了。
首先从 zlib主页上下载最新的zlib。
解压后,进入文件夹。

tar jxfv zlib-1.2.3.tar.bz2 
cd zlib-1.2.3/

之后就是配置:
在配置前先看看有什么选项
./configure --help
usage:
  configure [--shared] [--prefix=PREFIX]  [--exec_prefix=EXPREFIX]
     [--libdir=LIBDIR] [--includedir=INCLUDEDIR]
其中主要的是[--shared]                 编译共享库 
          [--prefix=PREFIX]          编译后安装位置,默认使用/usr/local
          [--exec_prefix=EXPREFIX]   程序型文件的安装位置,默认使用${prefix}
          [--libdir=LIBDIR]          库文件安装位置,默认使用${exec_prefix}/lib
          [--includedir=INCLUDEDIR]  头文件安装位置,默认使用${prefix}/include

这些从配置过的头文件就可以看出。

所以我的配置为
CC=arm-9tdmi-linux-gnu-gcc AR="arm-9tdmi-linux-gnu-ar rc " RANLIB=arm-9tdmi-linux-gnu-ranlib ./configure --prefix=$PREFIX --shared

为了make能找到你的编译器,之前你要先设好PATH

然后就是make;make install

至于前面的CC、AR、RANLIB什么时候要什么时候不要,取决于配置脚本。CC只要是交叉编译都是要的,除非你无聊到自己去该Makefile。其他的有是要有时不要,视情况而定。这次的从生成的Makefile来看是要的。 

经过以上的过程,会在$PREFIX下产生一下结构:

.
|-- include
|   |-- zconf.h
|   `-- zlib.h
|-- lib
|   |-- libz.so -> libz.so.1.2.3
|   |-- libz.so.1 -> libz.so.1.2.3
|   `-- libz.so.1.2.3
`-- share
    `-- man
        `-- man3
            `-- zlib.3


如果使用make uninstall,则库文件和man文件会被删除。

.
|-- include
|   |-- zconf.h
|   `-- zlib.h
|-- lib
`-- share
    `-- man
        `-- man3


zlib 1.2.5 编译:
对于2010年新发布的版本,配置命令稍有不同,下面是编译脚本:

#/bin/sh

CROSS_COMPILE=arm-linux-

PREFIX=$HOME/development/rootfs

CC=${CROSS_COMPILE}gcc AR=${CROSS_COMPILE}arRANLIB=${CROSS_COMPILE}ranlib ./configure --prefix=$PREFIX

make

make install

Command line: -prefix /home/liuyh/workspace/qt5.14.2-arm -opensource -confirm-license -release -strip -shared -xplatform linux-arm-gnueabi-g++ -optimized-qmake -c++std c++11 --rpath=no -pch -skip qt3d -skip qtactiveqt -skip qtandroidextras -skip qtcanvas3d -skip qtconnectivity -skip qtdatavis3d -skip qtdoc -skip qtgamepad -skip qtlocation -skip qtmacextras -skip qtnetworkauth -skip qtpurchasing -skip qtremoteobjects -skip qtscript -skip qtscxml -skip qtsensors -skip qtspeech -skip qtsvg -skip qttools -skip qttranslations -skip qtwayland -skip qtwebengine -skip qtwebview -skip qtwinextras -skip qtx11extras -skip qtxmlpatterns -make libs -make examples -nomake tools -nomake tests -gui -widgets -dbus-runtime --glib=no --iconv=no --pcre=qt --zlib=qt -no-openssl --freetype=qt --harfbuzz=qt -no-opengl -linuxfb --xcb=no -tslib --libpng=qt --libjpeg=qt --sqlite=qt -plugin-sql-sqlite -I/opt/tslib/include -L/opt/tslib/lib -recheck-all executing config test machineTuple + arm-linux-gnueabi-g++ -dumpmachine > sh: 1: arm-linux-gnueabi-g++: not found test config.qtbase.tests.machineTuple FAILED executing config test verifyspec + cd /home/liuyh/workspace/QT5.14.2/qt-everywhere-src-5.14.2/config.tests/verifyspec && /home/liuyh/workspace/QT5.14.2/qt-everywhere-src-5.14.2/qtbase/bin/qmake "CONFIG -= qt debug_and_release app_bundle lib_bundle" "CONFIG += shared warn_off console single_arch" 'QMAKE_LIBDIR += /opt/tslib/lib' 'INCLUDEPATH += /opt/tslib/include' -early "CONFIG += cross_compile" /home/liuyh/workspace/QT5.14.2/qt-everywhere-src-5.14.2/qtbase/config.tests/verifyspec + cd /home/liuyh/workspace/QT5.14.2/qt-everywhere-src-5.14.2/config.tests/verifyspec && MAKEFLAGS= /usr/bin/make clean && MAKEFLAGS= /usr/bin/make > rm -f verifyspec.o > rm -f *~ core *.core > arm-linux-gnueabi-g++ -c -O2 -march=armv7-a -mtune=cortex-a7 -mfpu=neon -mfloat-abi=hard -O2 -march=armv7-a -mtune=cortex-a7 -mfpu=neon -mfloat-abi=hard -pipe -O2 -w -fPIC -I/home/liuyh/workspace/QT5.14.2/qt-everywhere-src-5.14.2/qtbase/config.tests/verifyspec -I. -I/opt/tslib/include -I/home/liuyh/workspace/QT5.14.2/qt-everywhere-src-5.14.2/qtbase/mkspecs/linux-arm-gnueabi-g++ -o verifyspec.o /home/liuyh/workspace/QT5.14.2/qt-everywhere-src-5.14.2/qtbase/config.tests/verifyspec/verifyspec.cpp > make:arm-linux-gnueabi-g++:命令未找到 > make: *** [Makefile:172:verifyspec.o] 错误 127
06-09
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值