绪论
由于项目需要在嵌入式平台上使用 opencv,故需要交叉编译移植。
1.编译出错
第一次尝试交叉编译opencv是在虚拟机 Ubuntu环境下,我下载的交叉编译工具链的版本较低(4.5.1版本),因此我选择了低版本的opencv 3.4.16。没想到的时任然出现了问题,在这里展示部分报错,还望各路大神能够帮我指点迷津!
使用arm-linux-gcc 4.5.1交叉编译opencv 3.4.16 部分报错展示
2.转换思路
在尝试了各种办法,但仍未能解决问题,我选择了妥协……转而使用arm-linux-gnueabi 7.5.0版本的交叉编译工具成功编译通过。下面我将展示两种不同的cmake构建方式来交叉编译opencv3.4.16,如有不恰当的言语或描述,还望大神们不吝赐教。
2.1 采用 CMake-GUI的方式交叉编译
在有终端显示的Linux 系统下进行交叉编译,使用cmake-gui的方式无疑是一种操作简单、高效的构建方式,对于初学者来说十分友好。
2.1.1 下载opencv源码
居然是需要交叉编译移植,那么源代码就是必不可少的。笔者这里下载了opencv 3.4.16,Ubuntu 18.04 LTS下面就以这个版本为例。
http://opencv.org为opencv官网,你还可以直接进入github上进行下载,只不过网速可能会限制。
下载完成解压进入目录,如下图所示。
图中build、build_ARM、build-linux都是笔者自行创建的,后面会逐个解释。
2.1.2 创建 build_ARM文件夹 安装cmake
mkdir build_ARM 创建用于存放opencv源码交叉编译的目录
sudo apt install cmake
sudo apt-get install cmake-gui
安装完成后查看cmake版本,若能正常显示版本则表明安装成功。
2.1.3 安装opencv前安装环境依赖
sudo apt-get install build-essential
sudo apt-get install libopenblas-dev
sudo apt-get install git pkg-config libavcodec-dev libavformat-dev libswscale-dev
# 处理图像所需的包
sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff5-dev libdc1394-22-dev
sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev liblapacke-dev
# 处理视频所需的包
sudo apt-get install libxvidcore-dev libx264-dev
# 优化opencv功能
sudo apt-get install libatlas-base-dev gfortran
sudo apt-get install ffmpeg
———————————————————————— 此处参考博文:
https://blog.csdn.net/lyc_daniel/article/details/133439255?spm=1001.2014.3001.5501
2.1.4 安装交叉编译工具链
由于是交叉编译,这里就不得不提到一个重要的工具——交叉编译工具链。如果未安装交叉编译工具链,需要先安装交叉编译工具链并配置环境变量。笔者此处使用arm-linux-gnueabi 7.5.0版本的交叉编译工具。如需下载,请之家点击下方链接!Linaro Releases
解压后打开如下图所示:
复制bin目录的路径,同时打开家目录下.bashrc,配置交叉编译工具链环境变量并保存。
2.1.5 开始构建
进入之前创建的build_ARM目录,用sudo cmake-gui命令打开cmake
分别将opencv源代码路径和构建路径配置正确。点击Tools,选择 交叉编译器,点击“NEXT”。
选择系统为Linux,处理器为arm,编译器中找到gcc和g++的路径,如下图所示。
(C、C++、Target Root均来自该编译器目录,其他Target Root选择lib文件夹)
其他默认,完成点“Finish”。
2.1.6 勾选BUILD_ZLIB并配置安装路径
在完成上述操作后点击Configure、再点击Generate,红色消失就欧克!
2.1.7 开始编译
用 sudo make -j8命令,启动8个线程开始编译
2.1.8 安装opencv到指定目录
用sudo make install命令,将交叉编译的opencv安装到2.16中指定的/usr/local/opencv-3.4.16-arm-linux目录中.
2.1.9 配置opencv依赖的环境变量
打开 /etc/ld.so.conf.d/opencv.conf ,输入以下内容。
保存并退出后用 “sudo ldconfig”命令来是该变量生效。
用 “sudo gedit /etc/bash.bashrc”(vim 打开也可),写入pkg-config的路径,如下图所示。
保存退出后用“source /etc/bash.bashrc ”命令使环境变量生效,用“sudo updatedb”再做更新。
2.2 采用脚本进行交叉编译
在上文中笔者介绍了通过CMake -GUI的方式来构建工程,该种方式十分方便、快捷也非常容易上手,但是存在一定的局限性。比如在一些没有终端的设备上就无法通过编辑GUI的方式来快速构建工程,这时脚本就很好地解决了这一缺陷。
2.2.1 arm-toolchain.cmake
打开opencv 3.4.16 源码文件,建立build-linux文件夹,用于保存编译结果文件,同时在源码顶层目录中建立arm-toolchain.cmake 文件。
顶层目录展示
arm-toolchain.cmake 文件展示
在build-linux文件夹中创建 build-linux.sh 文件 。
build-linux 文件展示
build-linux.sh 脚本文件展示