准备工作
环境:ubuntu16.04 64bit
开发板:IMAX8
IMAX8交叉编译工具aarch64-linux-gnu
官网参考:https://docs.opencv.org/3.4.3/d0/d76/tutorial_arm_crosscompile_with_cmake.html
编译步骤
1、安装cmake和cmake-gui
sudo apt-get install camke cmake-gui cmake-qt-gui
sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libgtk2.0-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev
2、配置交叉编译环境
sudo gedit /etc/bash.bashrc
在最后一行加入交叉编译工具的bin目录:
使生效:
source /etc/bash.bashrc
3、编译opencv3.3.1源码
(1)官网下载地址:https://opencv.org/
(2)解压后进入该目录,新建一个build-arm目录
(3)执行cmake-gui,配置编译项
每当执行cmake-gui之前需要先卸载再安装两个包:
sudo apt-get autoremove libgtk2.0-dev pkg-config
sudo apt-get install libgtk2.0-dev pkg-config
然后,再执行:
cmake-gui
分别选择opencv3.3.1的解压目录(根目录)和建立的build-arm目录,如图:
再点击Configure,选择最后一行
点击Next
第一处取名为Linux,不要取图上的名字,不然会出问题;
第二处为gcc交叉编译器;
第三处为g++交叉编译器;
第四处为交叉编译工具bin目录;
然后Finish,出现:
然后自己选择编译哪些模块。下面是几项重要的配置:
1)加上BUILD_PNG和BUILD_JPEG;去掉WITH_TIFF,WITH_OPENEXR、BUILD_EXAMPLES和BUILD_CUDA
2)CMAKE_BUILD_TYPE选择Release
3)INSTALL目录修改一下,避免和PC的opencv冲突。
4)选择WITH_GTK或者WITH_GTK_2_X。
配置完成。再次点击Configure。可以看到没有了红色。 再点击“Generate”按钮,在build-arm目录下就产生了Makefile文件。
(4)编译
在编译之前需要配置几项参数,避免报错。
1)修改build-arm目录下的CMakeCache.txt
sudo gedit CMakeCache.txt
在CMake_EXE_LINKER_FLAGS:STRING后面添加:-lpthread -lrt -ldl;如图:
执行:
make
sudo make install
4、编译过程出现的错误整理
(1)错误1
error: #error "No suitable threading library available."
#error "No suitable threading library available."
错误如图:
解决:
参考:https://blog.csdn.net/XHW___001/article/details/87377357
sudo gedit xx/xx/common.cc
添加:
#define HAVE_PTHREAD
(2)错误2
can not be used when making a shared object; recompile with -fPIC
错误如图:
原因:
目前Linux OS系统会推出32位和64位两个不同的版本,由于32位程序和64位程序可能不兼容,因此如果在32bit OS环境下编译获得的库文件,移植入64bit环境时会产生Could not read symbols错误,一般是64 位 电脑才会出现。
参考:https://www.2cto.com/kf/201708/663543.html#
解决:
进入opencv目录下的3rdparty的对应目录CMakeFiles/ *.dir下,打开flags.make,在C_FLAGS = 后添加-O3 -fPIC用来支持在64位机上编译
如../3rdparty/zlib/CMakeFiles/zlib.dir/flags.make
修改C_FLAGS =-W -Wall 为 C_FLAGS =-O3 -fPIC-W -Wall
和
修改CXX_FLAGS =-W -Wall 为 C_FLAGS =-O3 -fPIC-W -Wall
(3)错误3
解决:
修改
${HOME}/opencv-3.3.1/3rdparty/libpng/pngpriv.h
注释掉:
/*# if (defined(__ARM_NEON__) || defined(__ARM_NEON)) && \*/
修改为:
if defined(PNG_ARM_NEON) && (defined(__ARM_NEON__) || defined(__ARM_NEON)) && \
参考:https://blog.csdn.net/weixin_42330265/article/details/80484978