嵌入式图像处理第一步:在Hi3516/Hi3518平台上为libpng-1.6.36编译zlib依赖库
嵌入式Hi3516/Hi3518平台zlib与libpng交叉编译实战指南
当你在海思Hi3516/Hi3518平台上开发图像处理应用时,PNG格式的支持往往必不可少。然而官方SDK可能并未提供libpng库,或者版本不兼容导致各种头疼的链接错误。本文将带你从源码开始,一步步完成zlib和libpng的交叉编译,最终生成能在开发板上稳定运行的静态库。
1. 环境准备与工具链配置
在开始之前,确保你的Ubuntu开发机已经安装了基本的编译工具和交叉编译器。海思平台通常使用arm-hisiv100nptl-linux-gcc工具链,这是整个编译过程的基础。
必备组件检查清单:
- Ubuntu 14.04/16.04 LTS(推荐)
- arm-hisiv100nptl-linux-gcc工具链
- 基本的开发工具:make、sed、tar等
- 至少100MB的可用磁盘空间
提示:可以通过运行
arm-hisiv100nptl-linux-gcc -v验证工具链是否安装正确。如果出现"command not found"错误,需要先配置工具链路径到环境变量中。
2. zlib库的交叉编译
zlib作为libpng的基础依赖,必须首先正确编译。我们选择1.2.11版本,这是经过广泛验证的稳定版本。
2.1 源码获取与解压
从zlib官网下载源码包:
wget http://www.zlib.net/fossils/zlib-1.2.11.tar.gz tar -xzvf zlib-1.2.11.tar.gz cd zlib-1.2.112.2 配置与编译
使用以下命令配置和编译zlib:
CC=arm-hisiv100nptl-linux-gcc ./configure --prefix=$PWD/../zlib_install make clean && make && make install关键参数解析:
CC:指定交叉编译器--prefix:设置安装目录,避免污染系统目录
编译完成后,检查zlib_install目录,应该包含以下结构:
zlib_install/ ├── include/ │ └── zlib.h ├── lib/ │ ├── libz.a │ └── pkgconfig/ └── share/3. libpng库的交叉编译
有了zlib基础,现在可以编译libpng了。我们选择1.6.36版本,这是与大多数嵌入式系统兼容良好的版本。
3.1 源码准备
下载并解压libpng源码:
wget https://sourceforge.net/projects/libpng/files/libpng16/1.6.36/libpng-1.6.36.tar.gz tar -xzvf libpng-1.6.36.tar.gz cd libpng-1.6.363.2 修改Makefile
libpng的编译需要手动配置Makefile:
cp scripts/makefile.linux Makefile然后编辑Makefile,修改以下关键参数:
CC=arm-hisiv100nptl-linux-gcc prefix=$(PWD)/../png_install ZLIBLIB=$(PWD)/../zlib_install/lib ZLIBINC=$(PWD)/../zlib_install/include3.3 执行编译
运行编译命令:
make clean && make && make install编译完成后,检查png_install目录,应该包含:
png_install/ ├── bin/ ├── include/ │ └── png.h ├── lib/ │ ├── libpng.a │ └── pkgconfig/ └── share/4. 自动化编译脚本
为了简化重复编译过程,我们可以创建一个自动化脚本build_png.sh:
#!/bin/bash # 设置工具链和安装路径 export CC=arm-hisiv100nptl-linux-gcc export ZLIB_INSTALL=$PWD/zlib_install export PNG_INSTALL=$PWD/png_install # 编译zlib tar -xzvf zlib-1.2.11.tar.gz cd zlib-1.2.11 ./configure --prefix=$ZLIB_INSTALL make clean && make && make install cd .. # 编译libpng tar -xzvf libpng-1.6.36.tar.gz cd libpng-1.6.36 cp scripts/makefile.linux Makefile sed -i "s|CC=gcc|CC=$CC|" Makefile sed -i "s|prefix=/usr/local|prefix=$PNG_INSTALL|" Makefile sed -i "s|ZLIBLIB=../zlib|ZLIBLIB=$ZLIB_INSTALL/lib|" Makefile sed -i "s|ZLIBINC=../zlib|ZLIBINC=$ZLIB_INSTALL/include|" Makefile make clean && make && make install cd ..脚本使用说明:
- 将脚本与源码包放在同一目录
- 给脚本执行权限:
chmod +x build_png.sh - 运行脚本:
./build_png.sh
5. 应用集成与问题排查
将编译好的库集成到你的项目中时,可能会遇到以下常见问题:
链接错误解决方案:
| 错误类型 | 可能原因 | 解决方法 |
|---|---|---|
| undefined reference to `inflate' | zlib链接顺序错误 | 确保-lz放在-lpng之后 |
| cannot find -lpng | 库路径未指定 | 添加-L/path/to/png_install/lib |
| incompatible target | 工具链不匹配 | 检查CC环境变量是否正确 |
编译选项建议:
CFLAGS += -I$(PNG_INSTALL)/include LDFLAGS += -L$(PNG_INSTALL)/lib -lpng -L$(ZLIB_INSTALL)/lib -lz在实际项目中,我曾遇到一个棘手的问题:当同时链接多个图像库时,由于符号冲突导致程序崩溃。解决方案是使用静态链接并隐藏不必要的符号:
arm-hisiv100nptl-linux-gcc -Wl,--whole-archive -lpng -lz -Wl,--no-whole-archive ...