赞
踩
近期分别在海思3559AV100平台和君正T40平台移植opencv4.5.2,遇到了不少问题,尤其是T40平台使用mips架构,交叉编译器为mips-linux-uclibc-gnu
遇到了一些问题,现将全过程整理记录如下:
前往opencv下载地址和opencv_contrib下载地址下载opencv源码,我下载的版本是opencv-4.5.2.zip
和opencv_contrib-4.5.2.tar.gz
先安装cmake和cmake-qt-gui
sudo apt-get install cmake -y
sudo apt install cmake-qt-gui -y
将下载的两个文件解压,然后再这两个文件夹同级目录下分别创建build和install两个文件夹分别用于cmake执行目录和install安装目录;
cmake-gui
配置源码目录和编译目录(配置cmake时必须使用绝对路径而不能使用相对路径)如下图:此处填写交叉编译工具的全路径,以防万一,如下图所示:
5. 修改安装路径CMAKE_INSTALL_PREFIX:
CMAKE_FIND_ROOT_PATH和ZLIB_INCLUDE_DIR
此处截图有误,ZLIB应该为绝对路径而不能为相对路径
7. 选中编译opencv_world库
如果无需编译example和test可以把相关的选项关闭。
再次点击configure知道没有红色出现,点击Generate等待出现Generating done,关闭CMake-gui;
修改CMakeCache.txt
CMAKE_EXE_LINKER_FLAGS:STRING= -lpthread -lrt -ldl
CMAKE_CXX_FLAGS:STRING=-fpermissive
至此configure完成;
将从网上下载的.i文件拷贝到opencv_contrib-xx/modules/xfeatures2d/src/
目录下;
在build文件夹下执行make -j4;中途会可能出现如下错误,解决方案如下:可以先修改后再执行make编译,编译耗时较长,我用虚拟机编译耗时接近两个小时;
#error "No suitable threading library available."
修改opencv源码下的3rdparty/protobuf/src/google/protobuf/stubs/common.cc
文件,添加\#define HAVE_PTHREAD
如下图:
error: operator '&&' has no right operand #if defined _FILE_OFFSET_BITS && _FILE_OFFSET_BITS == 64
修改你的编译器features.h,如我的/opt/hisi-linux/x86-arm/aarch64-himix100-linux/target/usr/include/features.h
在#if defined前面 加上#define _FILE_OFFSET_BITS 64
grfmt_jpeg.cpp:504:60: error: invalid conversion from 'JSAMPROW {aka char*}' to 'const uchar* {aka const unsigned char*}'
修改build目录下的CMakeCache.txt,添加CMAKE_CXX_FLAGS:STRING=-fpermissive
如下图:
undefined reference to `png_init_filter_functions_neon'
修改opencv下的 /3rdparty/libpng/pngpriv.h
130行
# if (defined(__ARM_NEON__) || defined(__ARM_NEON)) && \
改为
# if defined(PNG_ARM_NEON) && (defined(__ARM_NEON__) || defined(__ARM_NEON)) && \
base.hpp:548:17: error: 'cbrt' is not a member of 'std' return std::cbrt(val)
此问题在海思上移植时没出现问题,在T40上编译时报错,没找到原因,怀疑跟编译器有关系,将std::cbrt
修改成cbrt
即可正常编译通过;还有 std::copysign
也会报错,修改方式类似。
error: no matching function for call to 'find_if_not
std::find_if_not(name.begin(), name.end(), isspace);
改成:
std::find_if_not(name.begin(), name.end(), std::ptr_fun(::isspace));
编译完成后执行make install就会在指定的安装路径下安装bin include lib LICENSE share
四个文件夹,自此交叉编译安装完成;
链接:https://pan.baidu.com/s/15-mKThIjD_N8Gg5ZMN7_-A
提取码:1234
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。