Linux下交叉编译zlib库的方法 (linux交叉编译zlib)


一、背景介绍

在进行Linux系统嵌入式开发时,很多时候需要交叉编译一些库文件。其中,zlib库是一款用于压缩和解压缩数据的库文件,广泛应用于各种软件和系统中。本文将介绍在Linux环境下交叉编译zlib库的方法。

二、交叉编译准备工作

在进行交叉编译前,需要先准备好交叉编译工具链,以及目标平台的头文件和库文件。具体步骤如下:

1. 安装交叉编译工具链

根据目标平台的不同,可以选择不同的交叉编译工具链。以ARM架构为例,可以使用arm-linux-gcc工具链进行交叉编译。安装命令如下:

sudo apt-get install gcc-arm-linux-gnueabihf

2. 获取目标平台的头文件和库文件

可以从目标平台的SDK中获取,也可以使用交叉编译工具链自带的头文件和库文件。以ARM架构为例,可以使用下面的命令获取头文件和库文件:

sudo apt-get install libstdc++6-armhf-cross

sudo apt-get install libgcc1-armhf-cross

三、交叉编译zlib库

1. 下载zlib库源码

从zlib官网(https://www.zlib.net/)下载最新版本的zlib库源码,并解压缩到当前目录。

2. 设置交叉编译环境变量

为了让编译器知道我们要进行交叉编译,需要设置一些环境变量。以ARM架构为例,可以使用下面的命令设置环境变量:

export CC=arm-linux-gcc

export CXX=arm-linux-g++

export AR=arm-linux-ar

export AS=arm-linux-as

export LD=arm-linux-ld

export RANLIB=arm-linux-ranlib

3. 配置编译选项

使用下面的命令进行配置:

./configure –prefix= –static

其中,–prefix选项指定zlib库安装的路径,默认为/usr/local。–static选项表示编译静态库。

4. 开始编译

使用下面的命令开始编译:

make

也可以使用下面的命令进行多线程编译(根据CPU核数设置-j选项):

make -j4

5. 安装zlib库

使用下面的命令进行安装:

make install

到此为止,zlib库交叉编译完成。

四、测试zlib库

为了验证zlib库是否正确地交叉编译,可以进行如下测试:

1. 新建一个C++源文件test.cpp,内容如下:

#include

#include

using namespace std;

int mn()

{

const char *source = “Hello, world!”;

uLong sourceLen = strlen(source) + 1;

uLong destLen = compressBound(sourceLen);

Bytef *dest = new Bytef[destLen];

compress(dest, &destLen, (const Bytef *)source, sourceLen);

cout

delete[] dest;

return 0;

}

2. 使用下面的命令进行编译:

arm-linux-g++ -I -L test.cpp -lz -o test

其中,-I选项指定zlib头文件路径,-L选项指定zlib库文件路径,-lz选项指定连接zlib库。

3. 将生成的test可执行文件拷贝到目标平台上运行,输出结果应该为:

compressed data: xX�3�0?E?

如果输出结果为乱码,则说明zlib库没有正确地交叉编译。

五、

相关问题拓展阅读:

  • 如何交叉编译mkfs.jffs2等工具链mtd-utils

如何交叉编译mkfs.jffs2等工具链mtd-utils

首先说明一下:

在YAFFS2源文件的帆银灶态扮utils目录下,执行make就可以生成 mkyaffs2image工具,执行

.(要制作yaffs2的目录) (目标镜像)/mkyaffs2image

acl_2.2.47.orig.tar.gz

lzo-2.03.tar.gz

mtd-utils_.orig.tar.gz

zlib-1.2.3.tar.gz

mkfs.jffs2.for.arm-linux-gcc.3.4.1平台.tar.bz2

mkfs.jffs2.for.arm-linux-gcc.4.3.2平台.tar.bz2

mkfs.jffs2.for.pc平台.tar.bz2

如果只需要mkfs.jffs2工具,那么ubuntu 8.10下直接安装jffnms软件包即可,

luther@gliethttp:~$ sudo apt-get install jffnms

如果需要将jffs2移植到arm开发板上,那么就需要下载源码进行交叉编译了,这就是本文的内容.

1.下载工具软件源码包

luther@gliethttp:~$ wget

luther@gliethttp:~$ wget

luther@gliethttp:~$ wget

luther@gliethttp:~$ mkdir libs 用来存放下面生成的lib库.

2.编译zlib库

luther@gliethttp:~/zlib-1.2.3$ ./configure –prefix=~/libs –shared

对于交叉编译输入如下指令

luther@gliethttp:~/zlib-1.2.3$ CC=arm-linux-gcc ./configure –prefix=~/libs –shared

luther@gliethttp:~/zlib-1.2.3$ make -j4

luther@gliethttp:~/zlib-1.2.3$ make install

luther@gliethttp:~$ tree ~/libs

/home/ubuntu/libs

|– 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

5 directories, 6 files

这就表示完成了.

3.编译lzo库

luther@gliethttp:~/lzo-2.03$ ./configure –prefix=/home/ubuntu/libs –enable-shared

对于交叉编译输入如下指令搏禅

luther@gliethttp:~/lzo-2.03$ CC=arm-linux-gcc ./configure –host=arm-linux –prefix=/home/ubuntu/libs –enable-shared –disable-static

这个还必须要绝对路径才行.

luther@gliethttp:~/lzo-2.03$ make

luther@gliethttp:~/lzo-2.03$ make install

luther@gliethttp:~$ tree ~/libs

.

|– include

| |– lzo

| | |– lzo1.h

| | |– lzo1a.h

| | |– lzo1b.h

| | |– lzo1c.h

| | |– lzo1f.h

| | |– lzo1x.h

| | |– lzo1y.h

| | |– lzo1z.h

| | |– lzo2a.h

| | |– lzo_a.h

| | |– lzoconf.h

| | |– lzodefs.h

| | `– lzoutil.h

| |– zconf.h

| `– zlib.h

|– lib

| |– liblzo2.a

| |– liblzo2.la

| |– liblzo2.so -> liblzo2.so.2.0.0

| |– liblzo2.so.2 -> liblzo2.so.2.0.0

| |– liblzo2.so.2.0.0

| `– libz.a

`– share

`– man

`– man3

`– zlib.3

6 directories, 22 files

手工将静态库删掉就行了,

如果是arm平台还需要strip优化.

4.编译mtd-utils前的准备工作.

编译之前的代码工作

luther@gliethttp:~$ wget

luther@gliethttp:~$ mkdir libs/include/sys -p

luther@gliethttp:~$ cp acl-2.2.47/include/acl.h libs/include/sys

luther@gliethttp:~/mtd-utils$ export LD_LIBRARY_PATH=~/libs/lib:$LD_LIBRARY_PATH

如果还找不到-llzo2,那么把他拷到/usr/lib下,对于交叉编译器,就是拷贝到

比如

luther@gliethttp:~/libs/lib$ sudo cp -a * /vobs/tools/arm-tools/arm-linux-gcc-3.4.1/arm-linux/lib/

luther@gliethttp:~/mtd-utils$ vim Makefile

修改安装路径

DESTDIR=.

SBINDIR=gliethttp/in

MANDIR=gliethttp/share/man

INCLUDEDIR=gliethttp/include

修改CFLAGS变量

CFLAGS := -I./include -I/home/ubuntu/libs/include $(OPTFLAGS)

如果是arm-linux-gcc定义为

CFLAGS := -I./include -I/home/ubuntu/libs/include -DAI_ADDRCONFIG=0x0020 $(OPTFLAGS)

来自/usr/include/netdb.h

luther@gliethttp:~/mtd-utils$ vim ubi-utils/Makefile

DESTDIR := ~/mtd-utils

SBINDIR=gliethttp/in

MANDIR=gliethttp/share/man

INCLUDEDIR=gliethttp/include

luther@gliethttp:~/mtd-utils$ vim recv_image.c

拷贝/usr/include/netinet/in.h文件中

arm-linux-gcc中不需要拷贝它.

struct ip_mreq

{

struct in_addr imr_multiaddr;

struct in_addr imr_interface;

};

结构体数据到头部,否则在u盘版的ubuntu 8.10上老是提示没有ip_mreq定义,虽然上面明明写了#define _USE_MISC

arm-linux-gcc中还需要创建如3下个目录

luther@gliethttp:~/mtd-utils$ mkdir arm-linux

luther@gliethttp:~/mtd-utils$ cp -r ubi-utils arm-linux/

luther@gliethttp:~/mtd-utils$ cp -r include arm-linux/

luther@gliethttp:~/mtd-utils$ vim ubi-utils/src/libpfiflash.c

将所有EBUF(PFIFLASH_ERRSTR);全部替换为EBUF(“%s”, PFIFLASH_ERRSTR);

vim下替换脚本为

:%s/EBUF(PFIFLASH_ERRSTR\);/EBUF(“\%s”, PFIFLASH_ERRSTR\);/g

luther@gliethttp:~/mtd-utils$ vim ubi-utils/src/ubimirror.c

将第206行的

fprintf(stderr, err_buf);

改为

fprintf(stderr, “%s”, err_buf); // 想法是好的,因为err_buf中含有%d等format信息,这样接口更加统一,但是编译器似乎还并不支持这样的操作.

luther@gliethttp:~/mtd-utils$ vim ubi-utils/src/unubi.c

将第898行

char fname;

改为

char fname;

luther@gliethttp:~/mtd-utils$ cd ubi-utils/new-utils

因为-O2优化的原因,会导致如下log信息

error: ignoring return value of ‘scanf’, declared with attribute warn_unused_result

所有手工先编译.o

luther@gliethttp:~/mtd-utils/ubi-utils/new-utils$ gcc -Iinclude -Isrc -I../../include -Wall -Werror -Wall src/ubiformat.c -c -o ubiformat.o

对于交叉编译执行如下1条语句

luther@gliethttp:~/mtd-utils/ubi-utils/new-utils$ arm-linux-gcc -Iinclude -Isrc -I../../include -Wall -Werror -Wall src/ubiformat.c -c -o ubiformat.o

luther@gliethttp:~/mtd-utils/ubi-utils/new-utils$ cd –

好了,上面的所有修改完成之后,就可以执行make成功编译了.

luther@gliethttp:~/mtd-utils$ make

如果是交叉编译,执行

luther@gliethttp:~/mtd-utils$ make CROSS=arm-linux-

luther@gliethttp:~/mtd-utils$ make install

对于交叉编译,执行

luther@gliethttp:~/mtd-utils$ make CROSS=arm-linux- install

luther@gliethttp:~/mtd-utils$ tree gliethttp/

gliethttp/

|– in

| |– bin2nand

| |– doc_loadbios

| |– docfdisk

| |– flash_erase

| |– flash_eraseall

| |– flash_info

| |– flash_lock

| |– flash_otp_dump

| |– flash_otp_info

| |– flash_unlock

| |– flashcp

| |– ftl_check

| |– ftl_format

| |– jffs2dump

| |– mkbootenv

| |– mkfs.jffs2

| |– mkpfi

| |– mtd_debug

| |– nand2bin

| |– nanddump

| |– nandtest

| |– nandwrite

| |– nftl_format

| |– nftldump

| |– pddcustomize

| |– pfi2bin

| |– pfiflash

| |– recv_image

| |– rfddump

| |– rfdformat

| |– serve_image

| |– sumtool

| |– ubiattach

| |– ubicrc32

| |– ubicrc32.pl

| |– ubidetach

| |– ubigen

| |– ubimirror

| |– ubimkvol

| |– ubinfo

| |– ubinize

| |– ubirmvol

| |– ubiupdatevol

| `– unubi

`– share

`– man

`– man1

`– mkfs.jffs2.1.gz

4 directories, 45 files

ep9312开发板上没有任何文件系统flash数据读取

# ./mtd_debug read /dev/mtdgliethttp.bin

Copied 100 bytes from address 0xin flash to gliethttp.bin

# hexdump gliethttp.bin

ff ea00 350c e59f 001c ee e3a0

e583 4a03 e3ae254 fffd 1aff

e3aef ee594

eeee594

eee3ae583

e3ae254 fffd 1aff 4e1e e3a0

e

#

# ./mtd_debug read /dev/mtdgliethttp.bin;hexdump gliethttp.bin -Cv

Copied 100 bytes from address 0xin flash to gliethttp.bin

f 8bca 14 7d 4ae4 5a 0fe7 |……}J…Z.p..|

f 3fba0 0e 38 cd|y.?I6.1A…8.Wp.|

8 f3 19 3ba de 22 c0 a4 |….;`…`..N”..|

b4 81 cad 0d 59 db 4d dd 60 |…B.m.Y.Ir.+M.`|

4 eaa d2 b2 4b 2e f|r…..!….K..Vv|

b7 34 0b 1d cd b1 1d 6b bdc 95 db d1 |c.4…..k..6….|

b 90 d1 ea|….|

linux交叉编译zlib的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于linux交叉编译zlib,Linux下交叉编译zlib库的方法,如何交叉编译mkfs.jffs2等工具链mtd-utils的信息别忘了在本站进行查找喔。