OpenCV移植到ARM 全过程

我的环境

Host:VMware + Ubuntu 10.04
Target:Real6410 with Linux 2.6.38
Crossing Compiler:arm-linux-gcc 4.4.3 

一  交叉编译链的安装
1    解压,即可得到 arm-none-linux-gnueabi 目录
# tar –xjvf arm-none-linux-gnueabi-4.3.2.tar.bz2
2 为了使用方便,
还可以编辑/etc/bash.bashrc    文件添加把编译器路径到环境变量 PATH    中 ,
  只要在这个文件中添加下面这 2 个语句即可:
PATH=/root/ arm-none-linux-gnueabi-4.1.0/bin:$PATH
export PATH
3    编辑完毕后使用 source /etc/bash.bashrc 命令执行以下这个文件,让设置生效,之后再输
入:
# arm-none-linux-gnueabi-gcc -v
如果输出下面的信息则表面设置成功:
Using built-in specs.
Target: arm-none-linux-gnueabi
Configured with: /scratch/julian/lite-respin/linux/src/gcc-4.3/configure --build=i686-pc-
linux-
gnu --host=i686-pc-linux-gnu --target=arm-none-linux-gnueabi --enable-threads --disable-
libmudflap --disable-libssp --disable-libstdcxx-pch --with-gnu-as --with-gnu-ld --enable-
languages=c,c++ --enable-shared --enable-symvers=gnu --enable-__cxa_atexit --with-
pkgversion='Sourcery G++ Lite 2008q3-72' --with-
bugurl=https://support.codesourcery.com/GNUToolchain/ --disable-nls
--prefix=/opt/codesourcery
--with-sysroot=/opt/codesourcery/arm-none-linux-gnueabi/libc --with-build-
sysroot=/scratch/julian/lite-respin/linux/install/arm-none-linux-gnueabi/libc --with-
gmp=/scratch/julian/lite-respin/linux/obj/host-libs-2008q3-72-arm-none-linux-gnueabi-
i686-pc-
linux-gnu/usr --with-mpfr=/scratch/julian/lite-respin/linux/obj/host-libs-2008q3-72-arm-
none-
linux-gnueabi-i686-pc-linux-gnu/usr --disable-libgomp --enable-poison-system-directories
--with-
build-time-tools=/scratch/julian/lite-respin/linux/install/arm-none-linux-gnueabi/ bin --with-
build-
time-tools=/scratch/julian/lite-respin/linux/install/arm-none-linux-gnueabi/bin
Thread model: posix
1OpenCV移植到ARM    全过程 by Ken Cheung  2010-7-23
gcc version 4.3.2 (Sourcery G++ Lite 2008q3-72)
至此交叉编译链安装完成。
  二 交叉编译libjpeg
为了使OpenCV能处理jpeg图像,我们必须事先交叉编译好libjpeg
这里使用的版本是jpegsrc.v6b
1 下载libjpeg源码:
ftp://ftp.uu.net/graphics/jpeg/jpegsrc.v6b.tar.gz
2 解压进入目录
3 配置
#./configure --prefix=/root/libjpeg-arm --exec-prefix=/root/libjpeg-arm --enable-shared
--enable-static
 
下面分别介绍这几个参数的作用:
 
 --prefix=/root/libjpeg-arm : 执行make install 后,会将与体系无关的文件拷贝到此目录下,具
体如下:
 /root/libjpeg-arm.....................................
        |
       +---include........................................
             |
             ---jconfig.h
             |
             ---jerror.h
             |
             ---jmorecfg.h
             |
             ---jpeglib.h
       +---man............................................
             |
            +---man1.......................................
                  |
                  ---cjeg.1
                  |
                  ---djpeg.1
                  |
                  ---jpegtran.1
                  |
                  ---rdjpgcom.1
                  |
                  ---wrjpgcom.1
              
 --exec-prefix=/root/libjpeg-arm : 执行make install 后,会将与体系无关的文件拷贝到此目录
下,即将一些可执行程序、动态链接库和静态链接库拷贝到此目录的相应目录下,具体如下:
2OpenCV移植到ARM    全过程 by Ken Cheung  2010-7-23
 /root/libjpeg-arm........................................
        |
       +---bin............................................
             |
             ---cjeg
             |
             ---djpeg
             |
             ---jpegtran
             |
             ---rdjpgcom
             |
             ---wrjpgcom
       +---lib...........................................
             |
             ---libjpeg.la
             |
             ---libjpeg.so
             |
             ---libjpeg.so.62
             |
             ---libjpeg.so.62.0.0
          
 --enable-shared : 用GNU libtool   编译成动态链接库 。
4 修改生成的Makefile文件:
       # The name of your C compiler:
       CC= gcc     该成  CC= /root/arm-none-linux-gnueabi/bin/arm-none-linux-gnueabi-gcc
(根据你自己交叉编译器的位置修改)
       # library (.a) file creation command
       AR= ar rc    该成  AR= /root/arm-none-linux-gnueabi/bin/arm-none-linux-gnueabi-ar rc
 (同上)
       # second step in .a creation (use "touch" if not needed)
       AR2= ranlib    该成  AR2= /root/arm-none-linux-gnueabi/bin/arm-none-linux-gnueabi-
ranlib (同上)
5 在/root/libjpeg-arm   目录下建立 man/man1,include,lib,bin四个目录
6 # make
   # make install
7 将/root/libjpeg-arm/include/中(jconfig.h, jerror.h, jmorecfg.h, jpeglib.h)四个头文件拷
贝到:/root/arm-none-linux-gnueabi/arm-none-linux-gnueabi/include中。
   将/root/libjpeg-arm/lib中(libjpeg.la, libjpeg.so, libjpeg.so.62, libjpeg.so.62.0.0)四个库
文件拷贝到:/root/arm-none-linux-gnueabi/arm-none-linux-gnueabi/lib中
注意:执行以下命令检查生成的libjpeg.so是否为ARM版:
3OpenCV移植到ARM    全过程 by Ken Cheung  2010-7-23
# file libjpeg.so
以下为正确输出,否则检查交叉编译器路径以及Makefile并重新编译。
注意:执行完以上操作后执行以下命令检查库文件是否已正确安装:
# arm-linux-gcc -print-file-name=libjpeg.so
如果输出为"libjpeg.so"则说明没有正确安装,重复7步骤。
如果输出为"DIR/libjpeg.so"则说明安装正确。
至此libjpeg交叉编译完成。
    三 交叉编译 x264,xvid,ffmpeg
    为了使OpenCV能处理视频,我们要事先交叉编译ffmpeg,而ffmpeg又是依赖x264和
xvid的。
1 下载yasm:
http://www.tortall.net/projects/yasm/wiki/Download 下载yasm0.7.2(x264需要用
到的汇编编译器)
# ./configure --enable-shared --prefix=/root/arm-none-linux-gnueabi/arm-none-linux-
gnueabi/ --host=arm-linux
# make
# make install
2 交叉编译x264
  到
ftp://ftp.videolan.org/pub/videolan/x264/snapshots/ 下载x264-snapshot-20060805-
2245.tar.bz2,解压进入目录
(1).配置
# ./configure --prefix=/root/arm-none-linux-gnueabi/arm-none-linux-gnueabi/  --enable-
shared 
(2).   修改配置参数  
修改config.mak:
prefix=/root/arm-none-linux-gnueabi/arm-none-linux-gnueabi/
exec_prefix=${prefix}
bindir=${exec_prefix}/bin
libdir=${exec_prefix}/lib
includedir=${prefix}/include
# 这里改为ARM
ARCH=ARM
SYS=LINUX
# 这里改为arm-linux-gcc
CC=arm-linux-gcc
# 这里去掉-DHAVE_MMXEXT -DHAVE_SSE2 -DARCH_X86
CFLAGS=-Wall -I. -O4 -ffast-math -D__X264__ -DHAVE_MALLOC_H -DSYS_LINUX
-DHAVE_PTHREAD -s -fomit-frame-pointer
LDFLAGS= -lm -lpthread -s
AS=nasm
4OpenCV移植到ARM    全过程 by Ken Cheung  2010-7-23
ASFLAGS=-O2 -f elf
VFW=no
GTK=no
EXE=
VIS=no
HAVE_GETOPT_LONG=1
DEVNULL=/dev/null
CONFIGURE_ARGS= '--enable-shared' '--prefix=/root/arm-none-linux-gnueabi/arm-
none-linux-gnueabi/'
SONAME=libx264.so.49
default: $(SONAME)
 
修改Makefile,将66~68行的ar和ranlib改为arm下的:
 
libx264.a: .depend $(OBJS) $(OBJASM)
                arm-linux-ar rc libx264.a $(OBJS) $(OBJASM)
                arm-linux-ranlib libx264.a
 
(3).编译安装
 
# make
# make install 
这里可以在交叉编译链目录/root/arm-none-linux-gnueabi/arm-none-linux-gnueabi/的
lib下生成libx264.so
3 交叉编译xvid
  到
http://downloads.xvid.org/downloads/xvidcore-1.1.3.tar.gz  下载xvid
下载xvid解压并进入build/generic
配置
# ./configure --prefix=/root/arm-none-linux-gnueabi/arm-none-linux-gnueabi/ --disable-
assembly
    [解释]--disable-assembly :因为xvid没有针对ARM的汇编优化,所以编译时必须关掉汇

修改Makefile引用的platform.inc文件,将CC=gcc改为CC=arm-linux-gcc
# make
# make install
成功后进入example文件夹
测试,输入
arm-linux-gcc -o xvid_encraw xvid_encraw.c  -lc -lm -I../src/ -L../build/generic/=build
5OpenCV移植到ARM    全过程 by Ken Cheung  2010-7-23
-lxvidcore
即可生成xvid_encraw
这里可以在交叉编译链目录/root/arm-none-linux-gnueabi/arm-none-linux-gnueabi/的
include,lib下生成相应的头文件和库文件
4 交叉编译ffmpeg
http://download.chinaunix.net/download.php?id=5532&ResourceID=2990在这个网址
上下载ffmpeg-0.4.9-p20051120.tar.bz2,然后解压。
修改configure文件,要修改的如下
      由于cc、ar、ranlib、strip都是交叉编译环境中的执行文件,可以这样配置
      prefix="/root/arm-none-linux-gnueabi/arm-none-linux-gnueabi/"
       cross_prefix="root/arm-none-linux-gnueabi/bin/arm-linux-"
       cpu="arm"
配置
# ./configure --cpu=arm --cc=arm-linux-gcc --enable-shared  --disable-ffserver  --enable-
xvid --enable-x264 --enable-gpl  --enable-pthreads --disable-strip
# make
# make install

 

进入到ffmpeg源文件包中后,执行如下命令

export CC=arm-linux-gcc; export AR=arm-linux-ar; export LD=arm-linux-ld; export RANLIB=arm-linux-ranlib               

./configure --cpu=armv4l --cross-prefix=/usr/local/arm/3.3.2/bin/arm-linux- --cc=gcc --disable-opts --enable-shared

make

...
在make buildroot的rootfs的时候,编译MPlayer-1.0rc1出了问题:
armv4l/dsputil_arm_s.S:79:error:selected processor does not support 'pld[r1]'

和网上某位一样:
s3c2410嵌入式平台 交叉编译X264 FFMPEG 求助!
“好像是说不支持的指令,感觉非常奇怪,指定了arch=arm 的,怎么会出现不支持的指令呢。难道是我的版本不对”

自己确定已经配置成arm了,但是却有不支持的指令,很是奇怪,
后来去网上找到了如下解释:

Re: 3.5.4.1 status update and BSP request: msg#00003

The PLD instruction can just be ignored on arm4 - worst case it can be
commented/patched out or made conditional on arm5+. Its there to
"preload" memory so its safe to just ignore it on arches which don't
support it. I believe glibc uses macros for the function which only
result in the instruction being present in the arm5+ case. If you still
have problems, let me know and I'll try and look into it.

意思是,PLD这个指令,只有ARM5以上才支持,而此处,我的配置是arm922T,属于arm4,
不支持这个指令,可以直接忽略它。所以,用下面这个人的方法,
手动添加通过宏定义判断,就可以避开此问题了:

在cygwin下移植ffmpeg到wince
“3. armv4l/dsputil_arm_s.S:79:error:selected processor does not support 'pld[r1]'
这个是外部要定义下吧,
#ifndef HAVE_PLD
.macro pld reg
.endm
#endif

也就是,修改dsputil_arm_s.S,在前面添加上:
#ifndef HAVE_PLD
.macro pld reg
.endm
#endif
即可。其实做的更好的,应该是通过判定arm系统结构是5以下,不支持此PLD指令,然后再加上此定义。

【解决办法2】
网上有人换了个arm gcc编译器版本也可以解决此问题:
http://www.itdp.de/mplayer-users/2006-03/msg00308.html
“It seems this problem is realted to the ARM GCC 4.0. I used another ARM GCC 4.1
and did not receive this error message.”


这里可以在交叉编译链目录/root/arm-none-linux-gnueabi/arm-none-linux-gnueabi/的
include,lib下生成相应的头文件和库文件
至此,OpenCV所依赖的库都交叉编译完成,并在交叉编译链中的include,bin,share,lib下
有相应的文件
  四 交叉编译OpenCV
下载OpenCV-1.0.0   源码
http://www.opencv.org.cn/download/opencv-1.0.0.tar.gz
解压进入目录配置
# ./configure --host=arm-none-linux-gnueabi --without-gtk --without-carbon  --without-
quicktime --without-1394libs --with-ffmpeg --without-python --without-swig --enable-static
--enable-shared --disable-apps CXX=arm-none-linux-gnueabi-g++ CPPFLAGS=-
I/root/arm-none-linux-gnueabi/arm-none-linux-gnueabi/include LDFLAGS=-L/root/arm-
6OpenCV移植到ARM    全过程 by Ken Cheung  2010-7-23
none-linux-gnueabi/arm-none-linux-gnueabi/lib --with-v4l --prefix=/root/opencv-arm
--libdir=/root/opencv-arm/lib --includedir=/root/opencv-arm/include
说明:
      --host=arm-none-linux-gnueabi :指出交叉编译arm平台
      --without-gtk:忽略gtk+2.0 windows
      --without-carbon: 不使用Mac OS上的X库
      --without-quicktime
      --without-1394libs
      --without-ffmpeg
      --without-python
      --without-swig
      --enable-static :生成静态库
      --enable-shared :生成动态库
      CXX=arm-none-linux-gnueabi-g++    : 指定编译工具
      CPPFLAGS=-I/root/arm-none-linux-gnueabi/arm-none-linux-gnueabi/include :
OpenCV会用到一些dev的包,如png.h,jpeglib.h,大部分头文件在/usr/include下
      --prefix=/root/opencv-arm :指定安装目录
      -libdir=/root/opencv-arm/lib: 指定库文件安装位置
      --includedir=/root/opencv-arm/include:指定包含文件安装位置
如果配置正确,会有下面信息
General configuration ================================================
    Compiler:                 arm-none-linux-gnueabi-g++
    CXXFLAGS:                 -Wall -fno-rtti -pipe -O3 -fomit-frame-pointer
    Install path:             /root/opencv-arm
HighGUI configuration ================================================
    Windowing system --------------
    Use Carbon / Mac OS X:    no
    Use gtk+ 2.x:             no
    Use gthread:              no
    Image I/O ---------------------
    Use libjpeg:              yes
7OpenCV移植到ARM    全过程 by Ken Cheung  2010-7-23
    Use zlib:                 yes
    Use libpng:               yes
    Use libtiff:              no
    Use libjasper:            no
    Use libIlmImf:            no
    Video I/O ---------------------
    Use QuickTime / Mac OS X: no
    Use xine:                 no
    Use ffmpeg:               yes
    Use dc1394 & raw1394:     no
    Use v4l:                  yes
    Use v4l2:                 yes
Wrappers for other languages =========================================
    SWIG                     
    Python                    no
Additional build settings ============================================
    Build demo apps           no
Now run make ...
===================================================================
===
# make

../../cxcore/include/cxmisc.h:133:6: error: #elif with no expression

将#elif 改为 #else
# make install

arm上运行OpenCV所需库:
1 将/root/opencv-arm/lib下生成的库文件
libcvaux.so.1.0.0
libcv.so.1.0.0
libcxcore.so.1.0.0
libhighgui.so.1.0.0
libml.so.1.0.0
拷出来全部重命名
*.so.1
2 加上之前的库文件,将/root/arm-none-linux-gnueabi/arm-none-linux-gnueabi/lib下的
libjpeg,xvid,x264,ffmpeg库都拷出来放去板子的/usr/lib或者/lib下,也可以复制到板子上一
个文件夹,然后#export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/YOUR/lib/DIR
3 OpenCV所需库总表:
8OpenCV移植到ARM    全过程 by Ken Cheung  2010-7-23
 
编译源文件方法
arm-none-linux-gnueabi-g++ demo.c -o demo -I/root/opencv-arm/include/opencv
-L/root/opencv-arm/lib  -lcv -lcxcore -lpthread -lrt -lcvaux -lm -lpng -ljpeg -lz -lml -lhighgui
-ldl
最后,将生成的二进制文件拷到板子上就可运行
9

 

 

期间出过不少错误 。。。可惜没记录下来。。。但对这些错误现在已经基本上不怕了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值