libjpeg v8b已支持内存内位图的压缩和解压缩,在jpeglib.h中加入了函数jpeg_mem_src
和jpeg_mem_dest
,所以已不需要像使用v6b时修改代码。
假设你已安装好DM6446的编译环境,PATH环境变量也已经设好,可以正常使用arm_v5t_le-gcc。在IJG下载最新的libjpeg v8b,注意是下载Unix格式的jpegsrc.v8b.tar.gz,而不是Windows格式的jpegsr8b.zip,Windows格式的用不了。
1. 打开终端,切换到解压后的libjpeg路径。
$cd ./jpeg-8b
2. 设置环境变量
$export CC=arm_v5t_le-gcc
$export ARCH=arm
3. 编译
默认是静态库和动态库都编译的。如果你要使用动态库,那么还需要加入--prefix(指定.h等文件的安装路径)和
--exec-prefix(
指定动态库、静态库等文件的安装路径)。
$./configure --host=$ARCH-linux
$make
编译之后libjpeg.a和libjpeg.so都在隐藏目录jpeg-8b/.libs下。
4. 安装,如果要使用动态库,则执行此步。
#make install
5. 使用libjpeg静态库
因为montavista linux已自带libjpeg v6b了,我不想升级,所以打算用静态库。编译之后我将libjpeg.a复制到我的CODEC的app工程目录的lib目录下,为了以示区别,将其更名为libjpeg-8b.a,头文件需要jerror.h/jmorecfg.h/jpeglib.h
。CODEC工程可参考<CE_INSTALL_DIR>/examples。
一开始我修改的是app下的package.bld。
Pkg.addExecutable("bin/" + name, targ, plat, { cfgScript: cfg, lopts: "-L./lib -ljpeg-8b", }).addObjects(srcs);
但编译时没有通过,一大堆的错误提示:
package/cfg/bin/app...: undefined reference to 'jpeg_CreateCompress'
package/cfg/bin/app...: undefined reference to 'jpeg_stdio_dest'
package/cfg/bin/app...: undefined reference to 'jpeg_set_defaults'
...
package/cfg/bin/app...: undefined reference to 'jpeg_destroy_decompress'
collect2: ld returned 1 exit status
查阅了网上的资料后,发现问题在这:
# lnk470MV bin/app_remote.x470MV ...
/opt/mv_pro_4.0/montavista/pro/devkit/arm/v5t_le/bin/arm_v5t_le-gcc -g -L./lib -ljpeg-8b -o bin/app_remote... -lpthread -L/opt/mv_pro_4.0/montavista/pro/devkit/arm/v5t_le/armv5tl-montavista-linuxeabi/lib
连接静态库的时候,-l不能在-o的前面,否则就会出现undefined reference的错误。
于是恢复package.bld文件,改为修改user.bld,就解决问题了。
MVArm9.rootDir = "/opt/mv_pro_4.0/montavista/pro/devkit/arm/v5t_le"; MVArm9.lnkOpts.suffix = "-L./lib -ljpeg-8b " + MVArm9.lnkOpts.suffix.
修改之后,编译内容变化如下:
# lnk470MV bin/app_remote.x470MV ...
/opt/mv_pro_4.0/montavista/pro/devkit/arm/v5t_le/bin/arm_v5t_le-gcc -g -o bin/app_remote... -L./lib -ljpeg-8b -lpthread -L/opt/mv_pro_4.0/montavista/pro/devkit/arm/v5t_le/armv5tl-montavista-linuxeabi/lib