交叉编译libpng以及zlib开源库

作者: dreaming_ 2017-02-10 10:52:46

关于Linux开源库的编译过程,特别是在嵌入式系统中使用;




上图完美诠释了我本次编译的环境和运行目标;


 


下载zlib-1.2.8.tar.gz和libpng-1.6.17.tar.gz。


admin@ubuntu:~/src$ tar -zxvf libpng-1.6.17.tar.gz


admin@ubuntu:~/src/libpng-1.6.17$ ./configure


checking for a BSD-compatible install... /usr/bin/install -c


checking whether build environment is sane... yes


checking for a thread-safe mkdir -p... /bin/mkdir -p


checking for gawk... no


......


checking for zlibVersion in -lz... no


checking for z_zlibVersion in -lz... no


configure: error: zlib not installed


admin@ubuntu:~/src/libpng-1.6.17$ 


 


发现配置libpng-1.6.17出现了错误,找不到zlib。


因为libpng开源库的编译需要zlib库的支持;


所以下载了zlib-1.2.8.tar.gz;


编译zlib库


zlib编译的过程比较简单,./configure不传入参数,作者的初衷就是为了使zlib的编译配置过程更为简单;


这里使用gcc编译时特别顺利,但是使用嵌入式平台的交叉编译工具链(arm-none-linux-gnueabi-g++)编译时出现了大量错误;


因为zlib-1.2.8.tar.gz使用了部分不完全符合通用的语法,交叉编译工具无法识别,比如:


 


/* ============================================= */


int ZEXPORT deflateInit_(strm, level, version, stream_size)


z_streamp strm;


int level;


const char *version;


int stream_size;


{


return deflateInit2_(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL,


Z_DEFAULT_STRATEGY, version, stream_size);


/* To do: ignore strm->next_in if we use it as window */


}


/* ============================================= */


 


需要重新更改为:


/* ============================================= */


int ZEXPORT deflateInit_(//strm, level, version, stream_size)


z_streamp strm,


int level,


const char *version,


int stream_size)


{


return deflateInit2_(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL,


Z_DEFAULT_STRATEGY, version, stream_size);


/* To do: ignore strm->next_in if we use it as window */


}


/* ============================================= */


 


终于还是编译过了;


admin@ubuntu:~/src/zlib-1.2.8$ export CC=arm-none-linux-gnueabi-c++ 


admin@ubuntu:~/src/zlib-1.2.8$ ./configure


admin@ubuntu:~/src/zlib-1.2.8$ make clean


admin@ubuntu:~/src/zlib-1.2.8$ make


 


编译完成得到libz.a库。


 


下面可以编译libpng-1.6.17而得到libpng.a和libpng.so;


admin@ubuntu:~/src/libpng-1.6.17$ export LDFLAGS="-L/home/admin/src/zlib-1.2.8"


admin@ubuntu:~/src/libpng-1.6.17$ export CPPFLAGS="-I/home/admin/src/zlib-1.2.8"


admin@ubuntu:~/src/libpng-1.6.17$ ./configure CC=arm-none-linux-gnueabi-g++ --prefix=$PWD/_install --host=arm-linux


admin@ubuntu:~/src/libpng-1.6.17$ make && make install 


 


–prefix=配置编译输出的结果存放的目录,得到的是:


admin@ubuntu:~/src/libpng-1.6.17$ cd _install/


admin@ubuntu:~/src/libpng-1.6.17/_install$ ls


bin  include  lib  share


admin@ubuntu:~/src/libpng-1.6.17/_install$ ls lib


libpng16.a  libpng16.la  libpng16.so  libpng16.so.16  libpng16.so.16.17.0  libpng.a  libpng.la  libpng.so  pkgconfig


admin@ubuntu:~/src/libpng-1.6.17/_install$ 


admin@ubuntu:~/src/libpng-1.6.17/_install$ ls include/libpng16/


pngconf.h  png.h  pnglibconf.h


 


这里中间有个小细节要关注一下,就是libpng库跟zlib库有点小小不同的地方,zlib库编译的时候直接make命令就可以编译出libz.a和libz.so到当前目录,但是如果只使用make命令编译libpng库,在当前目录无法找到libpng.a和libpng.so;还是需要遵循文档说明使用make和make install命令:


admin@ubuntu:~/src/libpng-1.6.17$ make && make install 


 


zlib-1.2.8.tar.gz和libpng-1.6.17.tar.gz 文件下载:


http://download.csdn.net/detail/dreamintheworld/9750360


或者直接官网下载:


http://www.zlib.net/


http://www.libpng.org/pub/png/libpng.html


 


本文永久更新地址:http://www.linuxdiyf.com/linux/28305.html

相关资讯