编译平台:Ubuntu16.04LTS
目标板:ARM A9(三星的Exynos4412)
OpenCV移植到ARM-Linux之一:交叉编译第三方依赖库
OpenCV移植到ARM-Linux之二:交叉编译opencv库
1.下载所需要的第三方库源码包(可自行下载,也可在这下载)
添加环境变量,指定第三方依赖库安装路径
vim /etc/profile
末尾添加:
#opencv_3thparty_lib
export OPENCV_3THPARTY_LIB=/usr/local/arm/arm-2014.05/arm-none-linux-gnueabi/
(注:该路径我选择的是交叉编译链下的子目录,编译时会自动检索到该路径,若为其它普通路径,需自行添加该路径到系统链接环境变量LD_LIBRARY_PATH中)
2.在opencv目录(我的是opencv/)创建源码包文件夹3thparty_package
cd /home/jiangyu/opencv
mkdir 3thparty_package
3.交叉编译zlib
1)解压:
tar xvf zlib-1.2.8.tar.gz
2)编译
cd zlib-1.2.8
CC=arm-none-linux-gnueabi-gcc ./configure --prefix=$OPENCV_3THPARTY_LIB --shared
vim Makefile 将AR=ar改成AR=arm-none-linux-gnueabi-ar,RANLIB改成arm-none-linux-gnueabi-ranlib
make -j6
make install
4.交叉编译libjpeg
tar vxf jpegsrc.v9b.tar.gz
cd jpeg-9b/
./configure --host=arm-none-linux-gnueabi --prefix=$OPENCV_3THPARTY_LIB --enable-shared
make
make install
5.交叉编译libpng
xz -d libpng-1.6.32.tar.xz
tar -xvf libpng-1.6.32.tar
cd libpng-1.6.32/
./configure --host=arm-none-linux-gnueabi --prefix=$OPENCV_3THPARTY_LIB --enable-shared
出现错误(原因在于libpng依赖zlib库):configure: error: ZLib not installed
解决办法(添加zlib库到临时环境变量):
export LDFLAGS="-L/usr/local/arm/arm-2014.05/arm-none-linux-gnueabi/lib/"
export CPPFLAGS="-I/usr/local/arm/arm-2014.05/arm-none-linux-gnueabi/include/"
make
make install
6.交叉编译yasm
tar xvf yasm-1.3.0.tar.gz
cd yasm-1.3.0/
CC=arm-none-linux-gnueabi-gcc ./configure --host=arm-none-linux-gnueabi --prefix=$OPENCV_3THPARTY_LIB --enable-shared
出现错误:
checking build system type... Invalid configuration ` ': machine ` ' not recognized
configure: error: /bin/bash config/config.sub failed
解决办法:
sudo apt-get install libtool
cp /usr/share/libtool/build-aux/config.sub .
cp /usr/share/libtool/build-aux/config.guess .
make
make install
7.交叉编译libx264
tar xvf last_x264.tar.bz2
cd x264-snapshot-20171114-2245/CC=arm-none-linux-gnueabi-gcc ./configure --host=arm-none-linux-gnueabi --prefix=$OPENCV_3THPARTY_LIB --enable-shared
make
make install
8.交叉编译libxvid
tar xvf xvidcore_1.3.3.orig.tar.gz
cd xvidcore-1.3.3/cd build/generic
./configure --host=arm-none-linux-gnueabi --prefix=$OPENCV_3THPARTY_LIB --disable-assemblymake
make install
9.交叉编译ffmpeg
tar xvf jpegsrc.v9b.tar.gz
cd ffmpeg-3.4/
./configure --prefix=$OPENCV_3THPARTY_LIB --enable-shared --disable-static --enable-gpl --enable-cross-compile --arch=arm --disable-stripping --target-os=linux --enable-libx264 --enable-libxvid --cc=arm-none-linux-gnueabi-gcc --enable-swscale --extra-ldflags=-L/home/jiangyu/opencv/3thparty_package/opencv_3thparty_lib/lib --extra-cflags=-I/home/jiangyu/opencv/3thparty_package/opencv_3thparty_lib/include
make
make install
至此,opencv的第三方依赖库编译完成。
1.在opencv源码目录(/.../opencv/opencv-3.2.0/)下创建两个文件夹build和output,进入build目录。
cd build
cmake-gui
如图配置:
在弹出的窗口按如下配置,点击Next。
按照如下配置,Openrating System要写成Linux,不能写成arm-linux或者其他,因为cmake不能识别系统arm-linux,你可以试一下写成其他,这样在配置好的输出信息中会提示无法识别XXX系统。Compilers选择arm-linux-gcc和arm-linux-g++的绝对路径即可,Target Root选择第三方库的路径即/usr/local/arm/arm-2014.05/arm-none-linux-gnueabi/,其他的按照如下以下配置即可。
根据个人需求修改编译模块选项:
我的配置如下:
必选项:
BUILD ZLIB
BUILD_JPEG
BUILD_PNG
BUILD_JASPER
去除项:
WITH_TIFF
WITH_GTK
WITH_CUDA
WITH_1394
WITH_GSTREAMER
WITH_OPENEXR
WITH_OPENCL
修改项:
CMAKE_BUILD_TYPE 键值改成Release
CMAKE_INSTALL_PREFIX 键值改成源码目录下的output文件夹(即opencv库安装路径)
如下图所示:
然后点击Generate生成Makefile。
到此已经生成了初步配置的Makefile,关闭cmake。
2.编译: make
报如下类似错误:
In file included from /home/dyjun/opencv/git_opencv/opencv/3rdparty/libpng/pngpriv.h:904:0,
from /home/dyjun/opencv/git_opencv/opencv/3rdparty/libpng/png.c:14:
/home/dyjun/opencv/git_opencv/opencv/3rdparty/libpng/pngstruct.h:30:18: fatal error: zlib.h: No such file or directory
#include "zlib.h"
^
compilation terminated.
make[2]: *** [3rdparty/libpng/CMakeFiles/libpng.dir/png.c.o] Error 1
make[1]: *** [3rdparty/libpng/CMakeFiles/libpng.dir/all] Error 2
解决办法:
找到错误模块相关的CMakeLists.txt (如3rdparty/libpng/CMakeLists.txt )
在ocv_include_directories(含ZLIB_INCLUDE_DIRS) 行前面添加 :
set(ZLIB_INCLUDE_DIRS "/usr/local/arm/arm-2014.05/arm-none-linux-gnueabi/")
其它类似的错误也是如此解决。
继续make,出现错误:提示找不到pthread等系列函数
解决方案:在build目录下打开CMakeCache.txt文件,找到CMAKE_EXE_LINKER_FLAGS,在其后面加上-lpthread -lrt -ldl链接属性。
继续编译,未报错,编译成功。
3.安装:
make intall
安装完成后output目录内容如下,则表示成功。
4.拷贝动态库到ARM板
略
5.测试
略
至此,移植完成。