背景描述
- 需要在华为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)注释掉。
本文地址: opencv2.4.10-aarch64版本移植