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的信息别忘了在本站进行查找喔。
