LV07-01-zlib-移植

本文主要是zlib库的移植相关笔记。若笔记中有错误或者不合适的地方,欢迎批评指正😃。

点击查看使用工具及版本
Windows版本 windows11
Ubuntu版本 Ubuntu16.04的64位版本
VMware® Workstation 16 Pro 16.2.3 build-19376536
终端软件 MobaXterm(Professional Edition v23.0 Build 5042 (license))
Linux开发板 正点原子 i.MX6ULL Linux 阿尔法开发板
uboot NXP官方提供的uboot,NXP提供的版本为uboot-imx-rel_imx_4.1.15_2.1.0_ga(使用的uboot版本为U-Boot 2016.03)
linux内核 linux-4.15(NXP官方提供)
Win32DiskImager Win32DiskImager v1.0
buildroot 2023.05.1版本
点击查看本文参考资料
分类 网址 说明
官方网站 https://www.arm.com/ ARM官方网站,在这里我们可以找到Cotex-Mx以及ARMVx的一些文档
https://www.nxp.com.cn/ NXP官方网站
https://www.nxpic.org.cn/NXP 官方社区
https://u-boot.readthedocs.io/en/latest/u-boot官网
https://www.kernel.org/linux内核官网
点击查看相关文件下载
分类 网址 说明
NXP https://github.com/nxp-imx NXP imx开发资源GitHub组织,里边会有u-boot和linux内核的仓库
https://elixir.bootlin.com/linux/latest/source 在线阅读linux kernel源码
nxp-imx/linux-imx/releases/tag/rel_imx_4.1.15_2.1.0_ga NXP linux内核仓库tags中的rel_imx_4.1.15_2.1.0_ga
nxp-imx/uboot-imx/releases/tag/rel_imx_4.1.15_2.1.0_ga NXP u-boot仓库tags中的rel_imx_4.1.15_2.1.0_ga
I.MX6ULL i.MX 6ULL Applications Processors for Industrial Products I.MX6ULL 芯片手册(datasheet,可以在线查看)
i.MX 6ULL Applications ProcessorReference Manual I.MX6ULL 参考手册(下载后才能查看,需要登录NXP官网)

一、zlib库简介

1. 这是什么库?

zlib 是通用的压缩库,提供了一套 in-memory 压缩和解压函数,并能检测解压出来的数据的完整性(integrity)。zlib 也支持读写 gzip (.gz) 格式的文件。

2. 官网在哪

官网在这里:zlib Home Site,打开后如下:

image-20230806102853284

可以看到最新版本为1.2.13。

3. 源码下载

我们可以在这里下载源码,也就是主页往下翻就能找到:

image-20230806103046999

这里我就直接下载最新版本,然后解压后有如下文件和目录:

image-20230806103228928

二、移植zlib库

1. 编译源码

我们首先进入刚才解压的源码目录:

1
cd ~/5ALPHA/zlib-1.2.13/

然后执行以下命令:

1
2
3
4
5
6
7
mkdir -p ~/5ALPHA/zlib-1.2.13/zlib_output # 创建目录存放编译生成的文件

CC=arm-linux-gnueabihf-gcc LD=arm-linux-gnueabihf-ld AD=arm-linux-gnueabihfas ./configure --prefix=/home/hk/5ALPHA/zlib-1.2.13/zlib_output # 配置

make # 编译

make install # 安装

这个一般没什么坑,安装完毕后我们可以在zlib_output目录中看到以下文件:

image-20230806103823702

我们将 lib 目录下的 zlib 库文件拷贝到开发板根文件系统的 /lib 目录下,命令为:

1
sudo cp -rfa ~/5ALPHA/zlib-1.2.13/zlib_output/lib/* /home/hk/4nfs/buildroot/lib

2. 测试库是否可用

我们编写一个测试文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>  
#include <zlib.h>

int main()
{
/* 原始数据 */
unsigned char strSrc[] = "hello world!你好世界......";
unsigned char buf[1024] = {0};
unsigned char strDst[1024] = {0};
unsigned long srcLen = sizeof(strSrc);
unsigned long bufLen = sizeof(buf);
unsigned long dstLen = sizeof(strDst);

printf("Src string:%s\nLength:%ld\n", strSrc, srcLen);

/* 压缩 */
compress(buf, &bufLen, strSrc, srcLen);
printf("After Compressed Length:%ld\n", bufLen);

/* 解压缩 */
uncompress(strDst, &dstLen, buf, bufLen);
printf("After UnCompressed Length:%ld\n",dstLen);

printf("UnCompressed String:%s\n",strDst);

return 0;
}

然后在ubuntu中使用交叉编译工具链编译:

1
rm-linux-gnueabihf-gcc zlib_test.c -o zlib_test -Wall -lz -L ~/5ALPHA/zlib-1.2.13/zlib_output/lib -I ~/5ALPHA/zlib-1.2.13/zlib_output/include/

编译完成后,我们将它拷贝到根文件系统中,然后有以下打印说明移植的库可用:

image-20230806105040051

不清楚为什么压缩一下还变大了,不过不重要,我们主要是验证库是否可以用