背景描述

  • 需要在华为atlas200dk上移植opencv2.4.10,验证一个算法的运行效率。
  • 华为atlas200dk是aarch64架构的,要使用aarch64交叉编译器。
  • 宿主机环境为ubuntu 18.04,x86_64架构。

移植过程

移植思路

起初使用的是aarch64-linux-gnu-g++和aarch64-linux-gnu-gcc编译器,由Linaro公司开发,下载地址:https://snapshots.linaro.org/gnu-toolchain/

但在编译过程中遇到太多问题了,折腾好久没有走通,于是换了一个编译器,使用的是华为aarch64-himix100-linux-g++和aarch64-himix100-linux-gcc编译器。

在这个编译器上实现了opencv2.4.10-aarch64版本的移植,并且可以在atlas200dk上成功运行。

具体步骤

1、下载安装编译器、cmake、opencv源码

给出aarch64-himix100-linux编译器的下载链接:

链接:https://pan.baidu.com/s/1I81g44cameKVGwTWr0Kd4w?pwd=0sif
提取码:0sif

cmake使用命令行方式进行安装:

sudo apt-get install cmake cmake-gui

opencv源码下载请访问官网:https://opencv.org

2、cmake配置,生成makefile文件

解压源码,创建文件夹

tar -xvf opencv-2.4.10.tar.gz
cd opencv-2.4.10
mkdir install

进行cmake-gui配置

cmake-gui

首先选择源码目录和build目录

进行编译器配置

配置完成后点击finish,cmake会进行第一次configure。这一步最后显示报错没有完成,但是不影响,可以继续操作。

由于只需要opencv最核心的功能,所以将所有with带的第三方库都去掉

修改安装目录,改为自己的目录

全部完成后,点击generate。如果最后显示generate done,则已经在install目录下生成了makefile文件,可以继续进行make。否则要查看CMakeFiles/CMakeError.log文件,检查错误信息。

3、编译、安装opencv2.4.10

编译过程中产生的一些错误见问题及解决

cd install
sudo make -j4
sudo make install

4、移植opencv2.4.10

编译、安装完成后,生成的bin、include、lib、share文件在设置的安装目录下。

将安装目录下的include、lib文件分别拷贝到交叉编译器根目录和开发板目录对应的目录,就可以实现交叉编译opencv程序,并在开发板上运行。

问题及解决

1. 在编译过程中,libjpeg.a、libpng.a等出现重定位问题,建议recompile with -fPIC

这个问题貌似和汇编有关系,说在编译的过程中这些库使用了一些汇编代码。虽然都是aarch64,但是具体的架构有armv8、armv8-a等的区分,所以在./configure的时候要排除汇编的干扰,使用no-asm选项。

上面这是个不错的解决思路,但是在本次编译中,使用不到jpeg、png这些库。即便使用,也可以单独移植这些库,因此本次编译中解决的方法是,将WITH_JPEG、WITH_PNG等一系列用不到的三方库都设置为NO。这样这些代码和库不参与编译链接,规避了这个问题。

2. 在编译过程中,报pthread相关函数未定义的参考(undefined reference)错误

在cmake Generate完成后,修改CMakeCache.txt文件,将里面CMAKE_EXE_LINKER_FLAGS:STRING=后面添加-lpthread -lrt。

3. 在cmake过程中,报linux/videodev.h: No such file or directory错误

sudo apt-get install libv4l-dev
sudo ln -s /usr/include/libv4l1-video.h /usr/include/linux/videodev.h

4. 在cmake过程中,报undefined reference to 'jbg_newlen'错误

修改yourpath/opepcv-2.4.10/3rdparty/libtiff/CMakeLists.txt,将里面check_function_exists(jbg_newlen HAVE_JBG_NEWLEN)注释掉。

说点什么
请文明发言!
支持Markdown语法
好耶,沙发还空着ヾ(≧▽≦*)o
Loading...