ubuntu16.04 IMAX8编译opencv3.3.1

准备工作

环境: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目录

ubuntu16.04 IMAX8编译opencv3.3.1_第1张图片

(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目录,如图:

ubuntu16.04 IMAX8编译opencv3.3.1_第2张图片

再点击Configure,选择最后一行

ubuntu16.04 IMAX8编译opencv3.3.1_第3张图片

点击Next

ubuntu16.04 IMAX8编译opencv3.3.1_第4张图片

第一处取名为Linux,不要取图上的名字,不然会出问题;

第二处为gcc交叉编译器;

第三处为g++交叉编译器;

第四处为交叉编译工具bin目录;

然后Finish,出现:

ubuntu16.04 IMAX8编译opencv3.3.1_第5张图片

然后自己选择编译哪些模块。下面是几项重要的配置:

1)加上BUILD_PNG和BUILD_JPEG;去掉WITH_TIFF,WITH_OPENEXR、BUILD_EXAMPLES和BUILD_CUDA

2)CMAKE_BUILD_TYPE选择Release

3)INSTALL目录修改一下,避免和PC的opencv冲突。

ubuntu16.04 IMAX8编译opencv3.3.1_第6张图片

4)选择WITH_GTK或者WITH_GTK_2_X。

ubuntu16.04 IMAX8编译opencv3.3.1_第7张图片

配置完成。再次点击Configure。可以看到没有了红色。 再点击“Generate”按钮,在build-arm目录下就产生了Makefile文件。

ubuntu16.04 IMAX8编译opencv3.3.1_第8张图片

(4)编译

在编译之前需要配置几项参数,避免报错。

1)修改build-arm目录下的CMakeCache.txt

ubuntu16.04 IMAX8编译opencv3.3.1_第9张图片

sudo gedit CMakeCache.txt

在CMake_EXE_LINKER_FLAGS:STRING后面添加:-lpthread -lrt -ldl;如图:

 ubuntu16.04 IMAX8编译opencv3.3.1_第10张图片

执行:

make
sudo make install

4、编译过程出现的错误整理

(1)错误1

error: #error "No suitable threading library available."

 #error "No suitable threading library available."

错误如图: 

ubuntu16.04 IMAX8编译opencv3.3.1_第11张图片

解决:

参考:https://blog.csdn.net/XHW___001/article/details/87377357

sudo gedit xx/xx/common.cc

添加:

#define HAVE_PTHREAD 

ubuntu16.04 IMAX8编译opencv3.3.1_第12张图片

(2)错误2

can not be used when making a shared object; recompile with -fPIC

错误如图:

ubuntu16.04 IMAX8编译opencv3.3.1_第13张图片

原因:

目前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

ubuntu16.04 IMAX8编译opencv3.3.1_第14张图片

解决:

修改
${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

 

你可能感兴趣的:(Linux,ARM,OPENCV)