Ubuntu15.04交叉编译opencv到ARM全过程

来源:互联网 发布:php判断是否为素数 编辑:程序博客网 时间:2024/06/05 01:16

宿主机: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=/root/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=nasm
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
这里可以在交叉编译链目录/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=/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 -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更高版本交叉编译以后再写


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 宠物兔不吃不喝怎么办 兔子把木屑吃了怎么办? 小车司机碰瓷大车司机怎么办 在淘宝买到假的护肤品怎么办 淘宝购物发现是假的怎么办 电脑键盘灯不亮不能打字怎么办 海棠兔屁股有屎怎么办 大冒险告白被接受了怎么办剧透微博 大冒险被告白了怎么办 腐书网 大冒险告白被接受了怎么办 006 大冒险告白被接受了怎么办广播剧 coolpad手机解锁图案忘了怎么办 装死兔严重掉毛怎么办 兔子嘴巴磕破了怎么办 嘴巴里面摔烂了怎么办 兔子的鼻子损了怎么办 两个人嘴巴被粘牙糖粘住怎么办 小鸟被老鼠粘粘住了怎么办 小猫被老鼠粘粘住怎么办 羊子嘴巴烂了怎么办 小孩突然嘴肿了怎么办 电视机图像颜色变了 怎么办 冰沙床垫结块了怎么办 冰沙床垫融化了怎么办 脚真菌感染肿了怎么办 水雾魔珠被吃了怎么办 怀孕40天出血了怎么办 联璧金融里的钱怎么办 提现的钱不对怎么办 究极日月蛋太多怎么办 人脸识别不匹配怎么办 地下城没有属强怎么办 传奇属性点错了怎么办 龙之谷技能太多怎么办 龙之谷pk卡怎么办 为什么访问别人空间没有记录怎么办 被蚊孑咬了有小红包怎么办 微信建了个打牌群找不客源怎么办 三星手机一直停在开机画面怎么办 微信猜拳被骗了怎么办 组队领金币的码怎么办