背景

最近的一个工作任务是将之前在联咏平台上做的一个人脸识别的项目移植过去。之前这个项目主要是做的,移植的事情自然落到我身上了。组里也没人搞过瑞芯微的,开始踩坑淌水。

交叉编译工具

问了公司一圈人也没一个文档告诉我瑞芯微交叉编译的环境在哪儿,只有自己搭建一个了。

交叉编译工具链下载地址:

https://developer.arm.com/-/media/Files/downloads/gnu-a/8.3-2019.03/binrel/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf.tar.xz?revision=e09a1c45-0ed3-4a8e-b06b-db3978fd8d56&hash=E8254BD866E33EF3F2C650C535EE37C2318EF5D0https://developer.arm.com/-/media/Files/downloads/gnu-a/8.3-2019.03/binrel/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf.tar.xz?revision=e09a1c45-0ed3-4a8e-b06b-db3978fd8d56&hash=E8254BD866E33EF3F2C650C535EE37C2318EF5D0

配置 cmake toolchain,命名为toolchain_RK.cmake

# cmake_minimum_required (VERSION 3.12)# PLATEFORM_COMPILER_TOOL配置成自己交叉编译工具的目录
set(PLATEFORM_COMPILER_TOOL "/opt/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin/arm-linux-gnueabihf-")# this one is important
SET(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)
#this one not so much
SET(CMAKE_SYSTEM_VERSION 1)# where is the target environment
SET(CMAKE_FIND_ROOT_PATH /opt/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin/)# specify the cross compiler
set(CMAKE_C_COMPILER "${PLATEFORM_COMPILER_TOOL}gcc")
set(CMAKE_CXX_COMPILER "${PLATEFORM_COMPILER_TOOL}g++")# # search for programs in the build host directories
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
# # for libraries and headers in the target directories
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

编译opencv

从opencv 官网上下载opencv的源码进行编译。编译很简单

mkdir build_rk1109
cd build_rk1109
cmake .. -DCMAKE_TOOLCHAIN_FILE=../toolchain_RK.cmake

然后愉快得等待build完成,编译完成之后兴高采烈地开始进行测试。熟练地写上测试代码demo.cpp

#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/highgui/highgui.hpp>
int main()
{cv::Mat img;img = cv::imread("./1.jpg");std::cout << img << std::endl;
}

然后写成CMakeList.txt

cmake_minimum_required(VERSION 3.1)
project(demo)set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_STANDARD 11)set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")set(OPENCV_INCLUDE_DIRS /home/lc/Desktop/yutao/opencv/include)
set(OPENCV_LINK_LIBS /home/lc/Desktop/yutao/opencv/lib)link_directories(${OPENCV_LINK_LIBS})
include_directories(${OPENCV_INCLUDE_DIRS})
add_executable(demo demo.cpp)
target_link_libraries(demo opencv_coreopencv_highguiopencv_imgprocopencv_highgui)

然后就报错了。

问题分析和排查

现象1:

这是在链接libopencv_core.so的时候报的这么个错误,无非就是找不到这个reference。网上google了半天,都也试了各种参数都不work。最后在这两篇博客中找到了原因

​​​​​​ undefined reference to `std::__cxx11::basic_stringcentos上编译报错,部分信息如下: /usr/local/lib/libprotobuf.so.9: undefined reference to `std::__cxx11::basic_strhttps://www.cnblogs.com/lukybee/p/11846889.html,>

error: undefined symbol: std::__cxx11::basic_string和std::__1::basic_string_三级狗的博客-CSDN博客undefined symbol: cv::imwrite(cv::String const&, cv::_InputArray const&, std::__1::vector<int, std::__1::allocator > const&)https://blog.csdn.net/Three_dog/article/details/104701644原因就是gcc5以及以后的版本,将std::string和std::list重写,std::list变为std::__cxx11::list<int>,std::string在c++03库是std::basic_string<char>,而在c++11中变为了std::__cxx11::basic_string<char>。而为了在编译的时候兼容旧版本(链接阶段),可在编译的时候启动_GLIBCXX_USE_CXX11_ABI 宏指定具体链接的库。

于是照着博主的命令看了一眼自己编译出来的库

nm -D libopencv_core.so | c++filt | grep compare

嗯,确实是std::basic_string, 别人要的是std::__cxx11::basic_string,那找不到就正常了。所以解决办法就是重新编译opencv了,编译选项加上-std=c++11

现象2:

重新编译完之后,心想现在总能顺利编译了吧,结果还是报错了

怎么又找不到了? 网上有说加-D_GLIBCXX_USE_CXX11_ABI=1参数的。我试试看吧.

还是一样的报错,那换成0呢?

它又这样报错了。最后还是找到了问题原因

编译连接imread报错undefined reference to cv::imread(std::__cxx11::basic_string - 简书https://www.jianshu.com/p/2e79ef1b0471

新版本的opencv 把读取从链接库libopencv_highgui中剥离出来多了一个libopencv_imgcodecs出来。因此在使用新版本的opencv的时候需要把这个连接库也加上。

把libopencv_imgcodecs链上去之后,终于编译成功了!上板运行也成功了。

总结

本文介绍了本人在瑞芯微rv1109平台上交叉编译opencv的过程,下一步会尝试使用瑞芯微SDK进行推理,遇到问题将继续做记录

瑞芯微RV1109平台交叉编译踩坑相关推荐

  1. 【ROCKCHIP瑞芯微芯片平台方案介绍】

    瑞芯微芯片平台方案介绍 RK312X RK356X RK3288 RK3308 RK3326 RK3358 RK3399 RK3588 RV1126和RV1109 欢迎加入我们 这里是对本团队做了多年 ...

  2. 人脸识别嵌入式Linux芯片瑞芯微RV1109参数介绍

    瑞芯微RV1109是一款用于工控机或人工智能视觉应用的高性能机器视觉处理器SoC.它基于双核ARM Cortex-A7 32位内核,集成了NEON和FPU.每个核心有一个32KB的I-cache和32 ...

  3. 瑞芯微-RV1109主板各参数介绍

    瑞芯微-RV1109主板分析 1 瑞芯微电子Rockchip(以下简称瑞芯微),瑞芯微电子成立于2001年,总部位于福州,在深圳.上海.北京.杭州.香港及台湾均设有分支机构,是中国专业的集成电路设计公 ...

  4. 基于瑞芯微RV1109 Linux触摸屏GT911驱动调试心得(二)-设备树刷厂商给的触摸屏固件...

    之前调试触摸屏的文章如下: 基于瑞芯微RV1109 Linux触摸屏GT911驱动调试心得_Bruce.yang的嵌入式之旅-CSDN博客 由于之前调触摸屏一直都对不上点,然后厂商又给了我新的驱动代码 ...

  5. 瑞芯微-RV1109主板分析

    瑞芯微-RV1109主板分析 瑞芯微电子Rockchip(以下简称瑞芯微),瑞芯微电子成立于2001年,总部位于福州,在深圳.上海.北京.杭州.香港及台湾均设有分支机构,是中国专业的集成电路设计公司. ...

  6. 瑞芯微RK33XX平台的启动流程探究

    如果有问题,请加QQ群 891339868 进行交流 刚开始学习瑞芯微平台时,搞得我一脸懵逼,以前玩过儿imx283,也玩儿过nuc972,觉得应该都差不多,但是发现瑞芯微的底层和前面的两种还是有些不 ...

  7. 瑞芯微RK1126平台 通过http接口设置 ISP 饱和度 亮度 对比度

    通过HTTP的方式设置相机的亮度 饱和度 对比度 本来是想通过直接rk的提供的uapi那些接口直接设置isp的 但是 尝试在程序中直接调用 rkaiq那些功能程序会直接挂掉 后来 就看了下 自带的程序 ...

  8. 瑞芯微RV1126平台----yolov5输出后处理C++实现

    目录 1.前言 2.代码 2.1 padding resize 代码 2.2 瑞芯微yolov5后处理 2.3 坐标框的后处理 3.完整代码

  9. 在瑞芯微ok3568平台利用python实现Can通讯

    python版本:3.8 linux系统 项目需求:需要在ok3568平台上面接收振动传感器传来的数据,通讯方式为Can. 1.Can传感器配置 在控制台输入以下命令: ifconfig can0 d ...

最新文章

  1. 怎么对jdk核心包进行跟踪调试,并查看调试中的变量值
  2. Python3.7模块之hashlib
  3. Windows上Tomcat启动,服务中没有Tomcat
  4. laravel静态资源
  5. Java_Web--JDBC 增加记录操作模板
  6. csp-s模拟测试42「世界线·时间机器·密码」
  7. n维数组实现(可变参数表的使用)
  8. datatable???
  9. HDU3507 Print Article(斜率优化dp)
  10. 哪几种人会被房价拐点忽悠
  11. mongodb java 不等于_mongoDB在java上面的应用
  12. OpenCV探索之路(二十二):制作一个类“全能扫描王”的简易扫描软件
  13. Spring Security小例子
  14. 解决uni.request时uni.showtoast无效问题
  15. PCB布局布线的相关基本原理和设计技巧
  16. 【RPA】UIpath Academy BA篇
  17. c语言中怎么定义布尔类型变量
  18. 沙特认证_所有的沙特机器人去哪儿了
  19. 联创打印管理系统连接服务器失败,企业邮箱在Foxmail 7.2上POP3/IMAP协议设置方法...
  20. Myrio的各个接线口,有需要可以下载使用

热门文章

  1. 水星怎么设置网速最快_水星路由器怎么设置限速
  2. 除了FastJson,你也应该了解一下Jackson(二)
  3. 这些老外的开源技术养活了一票国产软件
  4. 985毕业的他裸辞都找不到工作,干了五年Android开发了,你觉得裸辞需不需要“冷静期”?
  5. 以过来人经验---分享从学生--工程师之学习--工作--生存三模式(上)
  6. java中定义变量名时大写__Java变量及类名称定义坑之第二个字母大写
  7. win7怎么恢复恢复回收站删除文件
  8. ios12完美深色模式插件_暗黑模式?安卓适配一波
  9. STM32控制42步进电机
  10. Java读取根据HTML模板生成HTML页面