编译环境fedora9.0
xvid版本:xvidcore-1.3.2.tar.gz
x264版本:x264-snapshot-20110612-2245.tar.bz2
yasm版本:yasm-0.7.2.tar.gz
ffmpeg版本:ffmpeg-0.5.3.tar.bz2
opencv版本:opencv-2.0.0
上面这些文件可以到http://download.csdn.net/detail/wc7620awjh/4866855处进行下载!
首先安装x86平台下opencv,网上很多都只有arm上opencv的移植,但对于开发阶段,都是在pc机的linux环境下开发测试的,所以这里先介绍一下x86平台下opencv的移植。
这里我们将所有ffmpeg相关的程序(yasm,xvid,x264)都存放在/usr/local/pc/ffmepg目录下,所以先要创建pc/ffmpeg目录
#mkdir -p /usr/local/pc/ffmepg
首先进入/tmp/目录下,将这些yasm.xvid,x264,opencv等压缩文件都放于此目录下并解压缩
首先进入xvid的配置目录下
#cd xvidcore/build/generic/
接着进行配置选择,编译及安装
#./configure --enable-shared --prefix=/usr/local/pc/ffmpeg
其中--prefix指定的目录表示安装后要将这些头文件及库文件放在那个目录下的include和lib下
编译安装
#make && make install //这里&&表示先执行完&&前面的命令,再执行后面的
编译yasm的作用是要在编译x264当中需要用到,进入yasm目录下
#cd yasm-0.7.2/
#./configure --prefix=/usr/local/pc/ffmpeg/ --enable-shared
#make && make install
进入x264目录下,进行配置编译
#cd x264-snapshot-20110612-2245/
#./configure --enable-shared --prefix=/usr/local/pc/ffmpeg/
进入ffmpeg目录下,进行配置编译
#cd ffmpeg-0.5.3
#./configure --prefix=/usr/local/pc/ffmpeg/ --disable-static --enable-shared --enable-gpl --enable-swscale --enable-libx264 --enable-libxvid --disable-stripping --arch=libavcodec/i386/ --enable-ffplay --enable-ffserver --disable-zlib --enable-gpl --disable-optimizations --disable-network --extra-libs=-L/usr/local/pc/ffmpeg/lib --extra-ldflags=-L/usr/local/pc/ffmpeg/lib --extra-cflags=-I/usr/local/pc/ffmpeg/include --disable-ipv6 --enable-pthreads
#make && make install
进入Opencv目录下,进行配置
#cd OpenCV-2.0.0/
#./configure --prefix=/usr/local/pc/opencv/ --with-v4l --without-python --without-swig --without-carbon --without-quicktime --without-1394libs --with-ffmpeg --enable-shared --enable-swscale --enable-gpl CXXFLAGS=-fno-strict-aliasing CFLAGS=-I/usr/local/pc/ffmpeg/include CPPFLAGS=-I/usr/local/pc/ffmpeg/include LDFLAGS=-L/usr/local/pc/ffmpeg/lib
配置后发现Use ffmpeg为no,如下紫色字体部分,在它上面可以看出,checking ffmpeg/avcodec.h usability...no等等都为no,从这几句话可以看出,在配置过程中,它会在/usr/local/pc/ffmpeg/include(因为我们在配置opencv中加入了CFLAGS=-I/usr/local/pc/ffmpeg/include CPPFLAGS=-I/usr/local/pc/ffmpeg/include)下查找ffmpeg下面是否有avcodec.h、avformat.h等头文件,发现找不到(进入/usr/local/pc/ffmpeg/include/目录下,可以发现这些头文件都放在各自自己的目录下了,如avcodec.h放在当前目录下的libavcodec目录下了),所以会出现下面红色字体部分的no.
解决办法:进入/usr/local/pc/ffmpeg/include目录下,新建一个ffmpeg目录(mkdir ffmpeg),将这些头文件都拷贝到此ffmepg目录下,如
cp libavcodec/* ffmpeg/
cp libavformat/* ffmpeg/
cp libavutil/* ffmpeg/
cp libswscale/* ffmpeg/
cp libavdevice/* ffmpeg/
checking ffmpeg/avcodec.h usability...no
checking ffmpeg/avcodec.h presence... no
checking for ffmpeg/avcodec.h... no
checking libavcodec/avcodec.h usability... no
checking libavcodec/avcodec.h presence... no
checking for libavcodec/avcodec.h... no
checking ffmpeg/avformat.h usability... no
checking ffmpeg/avformat.h presence... no
checking for ffmpeg/avformat.h... no
checking libavformat/avformat.h usability... yes
checking libavformat/avformat.h presence... yes
checking for libavformat/avformat.h... yes
checking for library containing avcodec_decode_video... no //
.......................................................................
.....................................................................
Video I/O ---------------------
Use QuickTime / Mac OS X: no
Use xine: no
Use gstreamer: no
Use ffmpeg: no
Use dc1394 & raw1394: no
Use dc1394_v2 & raw1394: no
Use v4l: yes
Use v4l2: yes
Use unicap: no
重新配置opencv,发现checking for library containing avcodec_decode_video...任然为no。
解决办法:进入/usr/local/pc/ffmpeg/lib,将这下面所有文件都拷贝到/usr/local/lib目录下
#cp -fr /usr/local/pc/ffmpeg/lib/* /usr/local/lib/
重新配置opencv,这次发现Use ffmpeg :yes
OK,剩下最后一步,编译安装
#make && make install
至此,X86平台下的opencv已经全部安装完毕,所有opencv函数所需的头文件和库文件都在/usr/local/pc/opencv/的include和lib下。
编译器:arm-linux-gcc-4.5.1
jpeg库:jpegsrc.v6b.tar.gz
png库:libpng-1.2.18.tar.bz2
zlib库:zlib-1.2.3.tar.gz
opencv版本:opencv-2.0.0
上面几个文件的下载可在此处下载:http://download.csdn.net/detail/wc7620awjh/4869411
关于zlib,libpng、libjpeg的安装,本文参考了http://www.linuxidc.com/Linux/2011-09/42826.htm文章,根据自己情况做了相应修改,在这里予以感谢!
opencv2.0依赖于zlib,libpng、libjpeg等图形库,而我们的交叉编译工具链是不带这些库的,可以到/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/lib/(我们安装/opt/FriendlyARM的目录) 目录下自行看一下,既然默认没带这些库,那就需要我们自行交叉编译这些库了!要将其安装到/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/include,/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/lib目录中。
# tar zxvf zlib-1.2.3.tar.gz
进入zlib-1.2.3的目录
打开zlib 库配置文件,可以发现它并不支持交叉编译选项,这里我们只能建立软连接,将linux系统自带的gcc指向交叉编译器的arm-linux-gcc:
# cd /usr/bin
建立gcc和ld的副本,为了后面用完之后返回时候所需。
#mv gcc gcc_back
#mv ld ld_back
建立软连接,使系统gcc和ld指向交叉编译器的arm-linux-gcc和arm-linux-ld
# ln -sv /opt/FriendlyARM/toolschain/4.5.1/bin/arm-linux-gcc ./gcc
# ln -sv /opt/FriendlyARM/toolschain/4.5.1/bin/arm-linux-ld ./ld
下面任然进入zlib-1.2.3目录下进行配置编译安装
#./configure --prefix=/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/ --shared
#make && make install
进入/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/的include和lib目录下可以发现多了一些文件。
下面将之前的gcc变回去,不然以后开发x86平台的程序就无法编译了。
#rm gcc
#rm ld
#mv gcc_back gcc
#mv ld_back ld
解压libpng-1.2.18.tar.bz2,进入libpng-1.2.18
libpng中没有提供configure脚本,需要自行修改Makefile文件。
#cp scripts/makefile.linux Makefile
#vi Makefile
CC=arm-linux-gcc //修改这里
MKDIR_P=mkdir -p
# where "make install" putslibpng12.a, libpng12.so*,
# libpng12/png.h and libpng12/pngconf.h
# Prefix must be a full pathname.
prefix=/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/
exec_prefix=$(prefix)
# Where the zlib library and include filesare located.
#ZLIBLIB=/usr/local/lib
#ZLIBINC=/usr/local/include
ZLIBLIB=/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/lib //修改这里
ZLIBINC=/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/include//修改这里
保存退出后执行如下命令:
#make && make install
进入/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/的include和lib目录下可以发现多了一些文件。
jpeg库的configure文件在设计方面存在一些问题,如果直接编译会出现错误,提示无法找到libtool,这是因为要先用gcc编译该文件夹下的dummy.c文件,要解决这个问题,要先在本机编译,然后再用make clean操作命令清除本机编译的结果,在进行交叉编译即可。
首先展开本机编译的jpeg库的工作,解压jpegsrc.v6b.tar.gz,并进入jpeg-6b目录,进行配置
#./configure --enable-shared --enable-static
#make
#make clean
接下来进行jpeg库的交叉编译:
#./configure --prefix=/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/ --host=arm-linux --enable-shared --enable-static
按此命令进行,然后修 改makefile文件将CC的值改为arm-linux-gcc,一定得改!!
#make
安装前需要在 arm-linux 下建个目录,不然安装会出错
#mkdir -pv /opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/man/man1
#make install
进入/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/的include和lib目录下可以发现多了一些文件。
接下来安装xvid,yasm,x264和ffmepg
解压xvid并进入xvidcore/build/generic
配置
# ./configure --prefix=/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/ --disable-assembly
修改Makefile易用的platform.inc文件,将CC=gcc改为CC=arm-linux-gcc
#make && make install
# ./configure --enable-shared --prefix=/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/ --host=arm-linux
# make
# make install
#./configure --prefix=/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/ --enable-shared --disable-asm
修改config.mak文件,红色字体是修改后的地方
将ARCH=ARM
CC=arm-linux-gcc
LD=arm-linux-gcc -o
AR=arm-linux-ar rc
RANLIB=arm-linux-ranlib
STRIP=arm-linux-strip
编译安装x264
#make && make install
#./configure --cross-prefix="/opt/FriendlyARM/toolschain/4.5.1/bin/arm-linux-" --enable-cross-compile --target-os=linux --cc=arm-linux-gcc --arch=arm --prefix=/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/ --enable-shared --disable-static --enable-gpl --enable-nonfree --enable-ffmpeg --disable-ffplay --enable-ffserver --enable-swscale --enable-pthreads --disable-yasm --disable-stripping --cpu=armv6 --enable-libx264--extra-cflags=-I/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/include --extra-ldflags=-L/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/lib--enable-libxvid
#make
#make install
#./configure --host=arm-linux --without-gtk --without-carbon --without-quicktime --without-1394libs --with-ffmpeg --without-python --without-swig --disable-apps --enable-shared GXX=arm-linux-g++ CPPFLAGS=-I/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/includeLDFLAGS=-L/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/lib--prefix=/usr/local/arm/arm-opencv --enable-static
#make && make install