libjpeg库和libpng库的移植和使用

目录
1、libjpeg库移植
2、zlib库移植
3、libpng库移植
4、开源库的使用方法
1、libjpeg库移植
【1】下载源码与准备交叉工具链
libjpegv6下载地址

【2】解压源码并进入解压后的目录

【3】配置

./configure --prefix=/opt/libdecode --exec-prefix=/opt/libdecode --enable-shared --enable-static -build=i386 -host=arm
1
注:/opt/libdecode为自定义的目录,用来存放库生成的各种库和头文件

【4】修改 Makefile

CC=gcc 改为 CC=arm-linux-gcc
AR=ar rc 改为 AR=arm-linux-ar rc
AR2=ranlib 改为  AR2=arm-linux-ranlib
1
2
3
【5】确认是否存在/opt/libdecode /include与/opt/libdecode/lib两个目录,若不存在则创建。

【6】make && make install-lib

注:移植jpegsrc.v9.tar.gz时,使用以下的配置

./configure --prefix=/opt/libdecode --host=arm-none-linux-gnueabi
1
【7】库的使用

安装完成后,可以在 /opt/libdecode/include 目录中找到libjpeg的头文件,以后在编译包含了libjpeg的工程时,必须指定 -I /opt/libdecode/include,同时在链接时需指定 -L /opt/libdecode/lib,若为动态链接,则必须将/opt/libdecode/lib 中的so文件拷贝到运行时环境,且使用export LD_LIBRARY_PATH 将之导出到环境变量。

2、zlib库移植
【1】源码下载网址为:zlib1.2.8

【2】解压并进入目录

tar -xvf zlib-1.2.8.tar.gz
1
【3】导出CC以确定配置时为arm-linux-

export CC=arm-linux-gcc
1
【4】配置zlib库,得到Makefile

./configure -shared --prefix=/opt/libdecode
1
【5】make && make install

指定库安装目录为/opt/libdecode,交叉编译后得到的zlib共享库文件放到了/opt/libdecode/lib中,头文件放到了/opt/libdecode/include中,man手册放到了/opt/libdecode/share/man下

3、libpng库移植
【1】libpng源码下载libpng1.6.6

【2】解压并进入目录

tar -xvf libpng-1.6.6.tar.gz
1
【3】配置

export LDFLAGS="-L/opt/libdecode/lib"
export CFLAGS="-I/opt/libdecode/include"
export CPPFLAGS="-I/opt/libdecode/include"
./configure --host=arm-linux --enable-shared --enable-static --prefix=/opt/libdecode
1
2
3
4
【4】make && make install

【5】如果在进行配置前并未按照2中所述安装zlib,则配置运行了一部分后,会报错:

configure: error: zlib not installed
1
错误提示zlib库未安装,原因是libpng库依赖于zlib库。因此在编译libpng前必须先安装zlib(注意安装的是交叉编译的zlib,而不是给x86平台下使用的zlib)。

【6】指定库安装目录为/opt/libdecode,交叉编译后得到的libpng共享库文件放到了/opt/libdecode/lib中,头文件放到了/opt/libdecode/include中,man手册放到了/opt/libdecode/share/man下

【7】头文件拷贝
进入/opt/libdecode/include中可以看到,默认安装时已经拷贝了png.h pnglibconf.h pngconf.h三个头文件。但是实际做png解码显示图片时发现,只有上述三个头文件(实际上只有png.h有用到)是不够的,还需要另外两个头文件pngstruct.h和pnginfo.h。
在libpng源码目录下执行以下两条指令,将两个头文件人为拷贝过去以备使用即可。

cp pnginfo.h /opt/libdecode/include/
cp pngstruct.h /opt/libdecode/include/
1
2
4、开源库的使用方法
【1】移植
(源码下载、解压、配置、修改Makefile、编译或交叉编译)。移植的目的是由源码得到三个东西:动态库.so,静态库.a,头文件.h

【2】部署动态库以使程序运行起来

第一种情况:放到/lib或者/usr/lib下,这样不需要给系统指定库路径,就能自动找到。
第二种情况:有时候对于一些不常用的库,我们不愿意将他放到lib或usr/lib目录下去,而是找个自定义的第三方的目录,单独将这些不常用的库放置,然后再用一定方法告诉操作系统去到这个路径下加载这个库。将该自定义第三方目录导出到环境变量LD_LIBRARY_PATH下即可。
【3】部署动态链接库一般有三个位置可以考虑:

第一个:/lib 如:cp /opt/libdecode/lib/*so* /x210_porting/rootfs/rootfs/lib
第二个:/usr/lib 如:cp /opt/libdecode/lib/*so* /x210_porting/rootfs/rootfs/usr/lib
第三个:任意指定目录如/opt/mylib,其做法如下
cd /x210_porting/rootfs/rootfs/opt/mylib
cp /opt/libdecode/lib/*so* ./
1
2
在开发板端export LD_LIBRARY_PATH=/opt/mylib:$LD_LIBRARY_PATH
echo $LD_LIBRARY_PATH
看见/opt/mylib: 即可
1
2
3
(注:我们制作的开发板在Ubuntu挂载的文件系统我的路为:/x210_porting/rootfs/rootfs/)

【4】使用(部署动态库so、部署静态库.a和头文件.h)

动态库是运行时环境需要的,编译程序时不需要。
静态库是静态连接时才需要,动态链接时不需要。
头文件.h是在编译程序时使用的,运行时不需要的。
所以动态库so文件是要放到开发板的文件系统中去的(放的过程就叫部署),把静态库.a文件和头文件.h文件放到ubuntu的文件系统中去。
【5】注意三个编译链接选项:-I(大i) -l(小L) -L

-I(大i)是编译选项(准确的是说是预处理选项CFLAGS或者CPPFLAGS中指定),用来指定预处理时查找头文件的范围的。
-l(小L)是链接选项(LDFLAGS中指定),用来指定链接额外的库(譬如我们用到了数学函数,就用-lm,链接器就会去链接libm.so;那么我们使用了libjpeg,对应的库名字就叫libjpeg.so,就需要用-ljpeg选项去链接)
-L是链接选项(LDFLAGS中指定),用来告诉链接器到哪个路径下面去找动态链接库。

原文地址:https://www.cnblogs.com/klausage/p/14763638.html