宿主机:Ubuntu15.04(64位系统)
目标机:飞凌OK6410
交叉编译器:arm-none-linux-gnueabi-4.3.2
一、安装交叉编译器
交叉编译器使用飞凌官方提供,将 arm-linux-gcc-4.3.2.tgz 文件拷贝到 Ubuntu 的根 目录下,该文件位于用户基础资料光盘的“实用工具”文件夹中。在 Ubuntu 中新建一个终端,输入下面的命令安装交叉编译器:
#cd /home/dell(进入/home/dell目录)
#mkdir /usr/local/arm(创建目录,若目录已存在会提示错误,跳过即可)
#tar zxvf arm-linux-gcc-4.3.2.tgz -C/
编译器解压到/usr/local/arm
把交叉编译器路径添加到系统环境变量中,以后可以直接在终端窗口中输入 arm-linx-gcc 命令来编译程序。
在终端中执行:gedit /etc/profile
添加以下四行到该文件中:
export PATH=/usr/local/arm/4.3.2/bin:$PATH
export TOOLCHAIN=/usr/local/arm/4.3.2
export TB_CC_PREFIX=arm-linux-
export PKG_CONFIG_PREFIX=$TOOLCHAIN/arm-none-linux-gnueabi
保存,退出。
重新启动系统,在终端里面执行
arm-linux-gcc 回车:
说明交叉编译器已经成功安装成功了。
二、交叉编译 libjpeg
为了使OpenCV 能处理jpeg 图像,我们必须事先交叉编译好libjpeg,这里使用的版本是jpegsrc.v6b
1 下载libjpeg源码:ftp://ftp.uu.net/graphics/jpeg/jpegsrc.v6b.tar.gz
2 解压进入目录
3 配置
#./configure --prefix=/usr/local/libjpeg-arm --exec-prefix=/usr/local/libjpeg-arm --enable-shared --enable-static
下面分别介绍这几个参数的作用:
--prefix=/usr/local/libjpeg-arm : 执行 make install 后,会将与体系无关的文件拷贝到此目录下
--exec-prefix=/root/libjpeg-arm : 执行make install 后,会将与体系无关的文件拷贝到此目录
下,即将一些可执行程序、动态链接库和静态链接库拷贝到此目录的相应目录下,具体如下:
--enable-shared : 用 GNU libtool
编译成动态链接库 。
4 修改生成的 Makefile文件:
# The name of your C compiler:
CC= gcc
该成 CC= /usr/local/arm/4.3.2/bin/arm-none-linux-gnueabi-gcc
(根据你自己交叉编译器的位置修改)
# library (.a) file creation command
AR= ar rc
该成 AR= /usr/local/arm/4.3.2/bin/arm-none-linux-gnueabi-ar rc
(同上)
# second step in .a creation (use "touch" if not needed)
AR2= ranlib
该成 AR2= /usr/local/arm/4.3.2/bin/arm-none-linux-gnueabi-ranlib (同上)
5 在/usr/local/libjpeg-arm
目录下建立 man/man1,include,lib,bin 四个目录
6 # make
可能会编译出错
这是libtool版本的问题,下载libtool-2.4.6.tar.gz,执行:
#./configure
#make
#make install
然后回到libjpeg目录,重新make,make install
# make install
7 将/usr/local/libjpeg-arm/include/中(jconfig.h, jerror.h, jmorecfg.h, jpeglib.h)四个头文件拷
贝到:/usr/local/arm/4.3.2/arm-none-linux-gnueabi/include 中。
将/root/libjpeg-arm/lib 中(libjpeg.la, libjpeg.so, libjpeg.so.62, libjpeg.so.62.0.0)四个库
文件拷贝到:/usr/local/arm/4.3.2/arm-none-linux-gnueabi/lib 中
注意:执行以下命令检查生成的libjpeg.so 是否为ARM 版:
# 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=/usr/local/arm/4.3.2/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=/usr/local/arm/4.3.2/arm-none-linux-gnueabi/arm-none-linux-gnueabi/ --enable-shared
(2).修改配置参数
修改config.mak:
prefix=/usr/local/arm/4.3.2/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=yasm
ASFLAGS=-O2 -f elf
VFW=no
GTK=no
EXE=
VIS=no
HAVE_GETOPT_LONG=1
DEVNULL=/dev/null
CONFIGURE_ARGS= '--enable-shared' '--prefix=/usr/local/arm/4.3.2/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
这里可以在交叉编译链目录/usr/local/arm/4.3.2/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=/usr/local/arm/4.3.2/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 -lxvidcore
即可生成xvid_encraw
这里可以在交叉编译链目录/usr/local/arm/4.3.2/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="/usr/local/arm/4.3.2/arm-none-linux-gnueabi/"
cross_prefix="/usr/local/arm/4.3.2/bin/"
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
这里可以在交叉编译链目录/usr/local/arm/4.3.2/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/usr/local/arm/4.3.2/arm-none-linux-gnueabi/include LDFLAGS=-L/usr/local/arm/4.3.2
/arm-none-linux-gnueabi/lib --with-v4l --prefix=/usr/local/opencv-arm --libdir=/usr/local/opencv-arm/lib --includedir=
/usr/local/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/usr/local/arm/4.3.2/arm-none-linux-gnueabi/include :
OpenCV 会用到一些 dev 的包,如 png.h,jpeglib.h,大部分头文件在/usr/include 下
--prefix=/usr/local/opencv-arm :指定安装目录
--libdir=/usr/local/opencv-arm/lib: 指定库文件安装位置
--includedir=/usr/local/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
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
# make install
arm 上运行OpenCV 所需库:
1 将/usr/local/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 加上之前的库文件,将/usr/local/arm/4.3.2/arm-none-linux-gnueabi/lib 下的libjpeg,xvid,x264,ffmpeg 库拷出来放去板子的/usr/lib 或者/lib下,然后#export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/YOUR/lib/DIR
3 OpenCV 所需库总表:
编译源文件方法
arm-none-linux-gnueabi-g++ demo.c -o demo -I/usr/local/opencv-arm/include/opencv -L/usr/local/opencv-arm/lib -lcv -lcxcore -lpthread -lrt -lcvaux -lm -lpng -ljpeg -lz -lml -lhighgui -ldl
最后,将生成的二进制文件拷到板子上就可运行
PS:OpenCV更高版本交叉编译以后再写