为DM6446交叉编译libjpeg v8b

libjpeg v8b已支持内存内位图的压缩和解压缩,在jpeglib.h中加入了函数jpeg_mem_srcjpeg_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

你可能感兴趣的:(linux,windows,unix,Path,reference,Codec)