opencv riscv的交叉编译与测试
目录
编译与测试环境:
opencv版本:opencv4.2
opencv4.2下载地址:GitHub - opencv/opencv at 4.2.0
riscv交叉编译工具链:riscv64-unknown-linux-gnu-gcc/g++
riscv交叉编译链地址:GitHub - riscv-collab/riscv-gnu-toolchain: GNU toolchain for RISC-V, including GCC
测试环境:qemu-riscv64
qemu-riscv地址:GitHub - riscvarchive/riscv-qemu: QEMU with RISC-V (RV64G, RV32G) Emulation Support
riscv交叉工具链安装说明:
# 拉取编译链代码(需要科学上网)
git clone --recursive https://github.com/riscv/riscv-gnu-toolchain
# 安装所需依赖
sudo apt-get install autoconf automake autotools-dev curl python3 libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev libexpat-dev
# 设置环境路径 如将/opt/riscv作为工具链安装路径,将/opt/riscv/bin加入环境变量路径中
# 编译
./configure --prefix=/opt/riscv
make linux
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
qemu-riscv64安装说明
# 安装所需依赖
sudo apt-get install gcc libc6-dev pkg-config bridge-utils uml-utilities zlib1g-dev libglib2.0-dev autoconf automake libtool libsdl1.2-dev
# 拉取代码
git clone https://github.com/riscv/riscv-qemu
cd riscv-qemu
git submodule update --init pixman
# 编译
./configure --target-list=riscv64-linux-user [--prefix=INSTALL_LOCATION]
make
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
交叉编译opencv
创建bulid目录,打开cmake-gui设置soucecode和bulid路径
cmake-gui选项:
参考:嵌入式开发之Opencv(一)交叉编译
可以根据需要选择需要build的功能模块
打开Advancd选项, 我另外设置了这些选项:
CMAKE_BUILD_TYPE Release
CMAKE_EXE_LINKER_FLAGS -lrt -lpthread
CMAKE_INSTALL_PREFIX /usr/lcoal/riscv/open-riscv # 自定义安装目录(默认是/usr/local)
Configure生成之后进入bulid目录,make即可!
遇到的错误:
- 错误1:找不到zlib.h
fatal error: zlib.h: No such file or directory
- 1
- 解决办法:
用riscv工具链交叉编译zlib库,并install到riscv工具路目录处
交叉编译zlib库参考:zlib的交叉编译
- 错误2:找不到进程库
../opencv3.4.0/3rdparty/protobuf/src/google/protobuf/stubs/common.cc:51:2: error: “No suitable threading library available.”
- 1
- 解决办法:
法1(推荐):
cmake-gui时打开Advancd选项
设置CMAKE_EXE_LINKER_FLAGS 为 -lrt -lpthread
图片: https://uploader.shimo.im/f/0XQImbqaFUgUShde.png
法2:
参考:Tina openwrt平台下opencv交叉编译-huangea的博客
- 错误3:类型转换错误
../opencv-4.1.1/modules/imgcodecs/src/grfmt_jpeg.cpp:224:58:
error: invalid conversion from ‘uchar* {aka unsigned char*}’ to ‘const JOCTET* {aka const char*}’ [-fpermissive]
state->source.pub.next_input_byte = m_buf.ptr();
- 1
- 2
- 3
相关链接:cross compile arm-linux show errors invalid conversion · Issue #15308 · opencv/opencv · GitHub(同一个错误)
- 解决办法:
之前cmake-gui时按默认选中的bulid模块编译时会遇到这个错,后来选择部分功能模块bulid就没遇到这个错了。(暂时随缘吧~)
测试opencv-riscv
测试程序:
#include <stdio.h>
#include <opencv2/opencv.hpp>
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/imgproc/types_c.h"
using namespace cv;
//将图片灰度化并保存
int main()
{
Mat image;
image = imread("./img.jpg");
if(!image.data)
{
printf("No image data \n");
return -1;
}else{
printf("read the image!\n");
}
Mat dst;
cvtColor(image,dst,CV_BGR2GRAY);
imwrite("dst.jpg", dst);
printf("change success!\n");
return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
编译命令:
riscv64-unknown-linux-gnu-g++ DisplayImage.cpp -o DispalyImage -I /usr/local/riscv/opencv-riscv/include/opencv4
-L /usr/local/riscv/opencv-riscv/lib -lopencv_core -lopencv_imgcodecs -lopencv_imgproc -lz
#-I Dir 指定include目录,在该目录下寻找引用的头文件
#-L Dir 指定库文件目录,在该目录下寻找链接的库文件
- 1
- 2
- 3
- 4
- 5
运行:
编译成功在qume-riscv64上运行
qemu-riscv64 -L /opt/riscv/64/sysroot DisplayImage
- 1
运行结果:
生成灰度化的图片
测试时遇到的错误:
- 错误1:找不到头文件
fatal error: opencv2/opencv.hpp: No such file or directory
- 1
- 解决办法:
编译的时候加上
-I /usr/local/riscv/opencv-riscv/include/opencv4 指定安装的opencv的include目录
- 错误2:找不到库文件
ld: cannot find -lopencv_core
ld: cannot find -lopencv_imgcodecs
...
- 1
- 2
- 3
- 解决办法:
编译的时候加上
-L /usr/local/riscv/opencv-riscv/lib 制定opencv库文件的目录
- 错误3:
undefined reference to `gzopen'
undefined reference to `gzclose'
undefined reference to `gzgets'
undefined reference to `gzputs'
- 1
- 2
- 3
- 4
- 问题与解决办法:
缺少zlib库引起的, 编译链接时加上 -lz
由于zlip库之前安装在riscv工具链的目录,而编译测试文件时链接的目录为opencv的目录,建议把zlib重新安装在opencv的目录里面(不然链接时可能会找不到zlib)。
- 错误4:
undefined reference to symbol '_ZTVN10__cxxabiv117__class_type_infoE@@CXXABI_1.3'
- 1
- 解决办法:
用riscv64-unknown-linux-gnu-gcc编译会遇到这个错,改为riscv64-unknown-linux-gnu-g++编译
- 错误5:
编译测试文件成功后,运行时遇到加载动态库时找不到动态库文件
DisplayImage:error while loading shared libraries: libopencv_core.so.4.2: cannot open shared object file: No such file or directory
- 1
- 解决办法:
设置环境变量,增加动态库目录路径到该变量中,再重新运行
export LD_LIBRARY_PATH="/usr/local/riscv/opencv-riscv/lib:$LD_LIBRARY_PATH"
版权声明:本文为ALLap97原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。