自己编译 ARM 版 opencv-mobile 解决编译器版本导致的 undefined reference to std::__cxx11::basic_stringstream 问题

起因

因项目需要在 arm 版中进行简单的图形运算,于是打算直接用 opencv-mobile 仓库预编译好的 opencv-mobile-4.5.4-armlinux.zip。但果然因为生产环境依赖的编译器版本太旧,在编译过程遇到了因为 ABI 接口导致的错误:

undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)
undefined reference to `std::__cxx11::basic_stringstream<char, std::char_traits<char>, std::allocator<char> > const&)
...

尝试直接使用 -D _GLIBCXX_USE_CXX11_ABI=0,无效
搜索一圈无果,(#20 #25 #27)

于是决定自己编译一遍,解决问题,顺便编写这个文档,方便后人查阅。

arm-linux-gnueabihf 编译步骤

  1. 前置步骤,在 Linux 中安装好 CMake,arm-linux-gnueabihf 工具链

  2. 下载 opencv-mobile 源码
    https://github.com/nihui/opencv-mobile/archive/refs/tags/v14.zip
    此处使用 v14 版本,使用其他版本可能需要在后续的操作中修改部分命令参数

  3. 进入 clone 所在文件夹,运行以下命令
    该命令会 A:下载 opencv 4.5.4; B:解压到 opencv-4.5.4 文件夹内; C:进入该文件夹.

wget -q https://github.com/opencv/opencv/archive/4.5.4.zip -O opencv-4.5.4.zip
unzip -q opencv-4.5.4.zip
cd opencv-4.5.4

此时,文件夹结构如图所示:
image-20220518152817266

  1. 编译

    1. 可选配置步骤,下面的指令都在 opencv-4.5.4 文件夹中执行

      1. strip zlib dependency and use stb-based highgui implementation (optional)

        patch -p1 -i ../opencv-4.5.4-no-zlib.patch
        truncate -s 0 cmake/OpenCVFindLibsGrfmt.cmake
        rm -rf modules/gapi
        rm -rf modules/highgui
        cp -r ../highgui modules/
        
      2. patch opencv source for no-rtti build (optional)

        patch -p1 -i ../opencv-4.5.4-no-rtti.patch
        
      3. apply your opencv options to opencv4_cmake_options.txt

        opencv4_cmake_options.txt 文件在 /opencv-mobile/opencv4_cmake_options.txt

    2. 依次执行指令进行编译

      mkdir build-arm-linux-gnueabihf && cd build-arm-linux-gnueabihf
      cmake -DCMAKE_TOOLCHAIN_FILE=../../toolchains/arm-linux-gnueabihf.toolchain.cmake \
              -DCMAKE_C_FLAGS="-fno-rtti -fno-exceptions" -DCMAKE_CXX_FLAGS="-fno-rtti -fno-exceptions" \
              -DCMAKE_INSTALL_PREFIX=install -DCMAKE_BUILD_TYPE=Release `cat ../../opencv4_cmake_options.txt` -DBUILD_opencv_world=OFF ..
      cmake --build . -j 2
      cmake --build . --target install
      
  2. 编译完成

    1. 输出位于 ./build-arm-linux-gnueabihf/install 中
    2. 把 install 移动到合适位置,如 /thirdpart/opencv4.5.4/my-gnueabihf/
  3. 使用编译好的库

    main.cpp

    #include <opencv2/opencv.hpp>
    #include <iostream>
    int main()
    {
        cv::Mat mat = cv::Mat::zeros(256,256, CV_8UC1);
        {
            cv::rectangle(mat, cv::Rect(40, 45, 51, 65), cv::Scalar(255), -1, cv::LINE_8, 0);//绘制填充矩形
            cv::rectangle(mat, cv::Rect(180, 180, 85, 21), cv::Scalar(255), -1, cv::LINE_8, 0);//绘制填充矩形
            std::cout << "mat.rows = " << mat.rows << std::endl;
            std::cout << "mat.cols = " << mat.cols << std::endl;
        }
        return 0;
    }
    

    demo makefile

    # 改成你的路径
    OPENCV_DIR := /thirdpart/opencv4.5.4/my-gnueabihf/
    THIRD_PART_INCLUDE := -I$(OPENCV_DIR)include/opencv4 -I$(OPENCV_DIR)include/opencv4/opencv2
    THIRD_PART_LIBRARY := $(OPENCV_DIR)lib/libopencv_highgui.a $(OPENCV_DIR)lib/libopencv_features2d.a $(OPENCV_DIR)lib/libopencv_imgproc.a $(OPENCV_DIR)lib/libopencv_photo.a $(OPENCV_DIR)lib/libopencv_video.a $(OPENCV_DIR)lib/libopencv_core.a
    
    TARGET = Test_OpenCV_Mobile
    START:
        @echo START
        rm -rf $(TARGET)
        arm-linux-gnueabihf-g++ -O2 -std=c++11 -lpthread -fopenmp -ldl $(CFLAGS) $(THIRD_PART_INCLUDE) -o $(TARGET) ./main.cpp $(THIRD_PART_LIBRARY)
    
    .PHONY:clean
    
    clean:
        rm -rf $(BINDIR)
    

    image-20220518155708643

    demo CMakeLists.txt

    cmake_minimum_required(VERSION 3.20)
    
    set (ARM_LINUX_GCC_PATH /usr/local/arm/gcc-linaro-5.3.1-2016.05-i686_arm-linux-gnueabihf/bin/) # 改成你的路径
    set (CMAKE_C_COMPILER ${ARM_LINUX_GCC_PATH}arm-linux-gnueabihf-gcc)
    set (CMAKE_CXX_COMPILER ${ARM_LINUX_GCC_PATH}arm-linux-gnueabihf-g++)
    
    project(Test_OpenCV_Mobile)
    set(CMAKE_CXX_STANDARD 11)
    set(OpenCV_DIR "/thirdpart/opencv4.5.4/my-gnueabihf/lib/cmake/opencv4") # 改成你的路径
    find_package(OpenCV REQUIRED)
    FIND_PACKAGE(OpenMP REQUIRED)
    add_executable(Test_OpenCV_Mobile main.cpp)
    target_link_libraries(Test_OpenCV_Mobile pthread)
    target_link_libraries(Test_OpenCV_Mobile dl)
    target_link_libraries(Test_OpenCV_Mobile -fopenmp)
    target_link_libraries(Test_OpenCV_Mobile ${OpenCV_LIBS})
    

    image-20220518160849421

    运行结果
    image-20220518154610943


最后在末尾推荐使用,PRemoteM 来打开 SSH、SFTP、RDP 远程会话。

posted @ 2022-05-18 16:37 V·Shawn 阅读(1576) 评论(0) 推荐(0) 编辑
摘要: Windows如何远程到另一台 Windows管理多个远程服务器 Windows第三方远程管理工具 准备远程机器 开启远程机器的远程桌面功能 首先在此电脑(我的电脑)图标上点击鼠标右键,选择"属性",再选择"高级系统设置",在"远程"选项卡中勾选"允许远程连接到此计算机"。 如果没有这个选项,则说明 阅读全文
posted @ 2020-08-23 12:01 V·Shawn 阅读(2174) 评论(5) 推荐(1) 编辑
摘要: 上星期趁着论文提交的空挡,把一直拖着的一个小项目开了个头,其实是朋友有个外快小项目要做,具体内容不说,项目的基础是XY平台的视觉控制,因此在前期研究中主要要做平台选型、控制购买、接线研究、模拟实验等工作,这里记述下来以防忘记,顺便也给其他人做个参考。 本次控制通过相机采集图像,以此为反馈信号做控制,使平台上的某个点位移到指定的位置。然后本文写得更像随笔形式,内容可能有点杂乱,见谅了。 阅读全文
posted @ 2017-05-01 23:42 V·Shawn 阅读(3018) 评论(0) 推荐(0) 编辑
摘要: 根据文章《相机位姿估计1:根据四个特征点估计相机姿态》的内容,我们根据P1、P2、P3、P4四点的空间坐标,可以估计出两次拍照的相机位姿Oc1与Oc2,也就知道了相机的坐标Oc1与Oc2。那么将Oc1与P,Oc2与P联成直线(如上图的橙色线),则可以获得两条直线方程,组成方程组求解得到它们的交点,即为待求点P的坐标。到三维空间中,原理跟二维是一样的,只是两条直线从二维空间升到了三维空间成为了两条空间。 阅读全文
posted @ 2017-01-22 22:44 V·Shawn 阅读(20627) 评论(8) 推荐(2) 编辑
摘要: 本文将展示一个实时相机位姿估计的例程,其中的原理在前文中已经说过了,再利用《相机位姿估计1_1:OpenCV、solvePnP二次封装与性能测试》中构建的类,使得程序处理更加简单。本例程利用HSV空间,跟踪红色的特征点,将跟踪到的特征点用于解PNP问题,得到相机位姿(相机的世界坐标与相机的三个旋转角)。最后使用labview中的三维图片控件,对整个系统进行3D重建。 阅读全文
posted @ 2016-12-13 00:42 V·Shawn 阅读(14921) 评论(1) 推荐(1) 编辑
摘要: 关键词:OpenCV::solvePnP 文章类型:方法封装、测试 @Author:VShawn(singlex@foxmail.com) @Date:2016-11-27 @Lab: CvLab202@CSU 前言 今天给大家带来的是一篇关于程序功能、性能测试的文章,读过《相机位姿估计1:根据四个 阅读全文
posted @ 2016-11-28 23:12 V·Shawn 阅读(19508) 评论(5) 推荐(2) 编辑
摘要: 关键词:空间几何 用途:总有地方会用到吧 文章类型:C++函数展示 @Author:VShawn(singlex@foxmail.com) @Date:2016-11-19 @Lab: CvLab202@CSU 对于空间内的两条直线A,B我假设他们一定不平行,也不相交。若已知A上两点A1、A2,B上 阅读全文
posted @ 2016-11-22 23:31 V·Shawn 阅读(4744) 评论(0) 推荐(0) 编辑
摘要: 关键词:位姿估计 OpenCV::solvePnP 用途:各种位姿估计 文章类型:原理、流程、Demo示例 @Author:VShawn(singlex@foxmail.com) @Date:2016-11-18 @Lab: CvLab202@CSU 目录 《相机位姿估计0:基本原理之如何解PNP问 阅读全文
posted @ 2016-11-20 21:17 V·Shawn 阅读(61260) 评论(30) 推荐(7) 编辑
摘要: 关键词:相机位姿估计 PNP问题求解 用途:各种位姿估计 文章类型:原理 @Author:VShawn(singlex@foxmail.com) @Date:2016-11-18 @Lab: CvLab202@CSU 目录 《相机位姿估计0:基本原理之如何解PNP问题》 《相机位姿估计1:根据四个特 阅读全文
posted @ 2016-11-20 17:00 V·Shawn 阅读(33492) 评论(5) 推荐(5) 编辑
摘要: 2016年10月某日 9月在51job上提交的中国移动简历终于有了反应,在这天收到邮件让我参加中国移动的统一上机考试。 欢迎参加中国移动通信集团公司2017年度校园招聘统一考试,请注意以下事项: 1. 请使用通知短信中的用户名及密码登陆本网站进行考试预约以及准考证打印。建议使用PC端的谷歌,IE 1 阅读全文
posted @ 2016-11-18 00:21 V·Shawn 阅读(1071) 评论(1) 推荐(0) 编辑
摘要: 关键词:空间旋转、旋转轴、刚体旋转 用途:相机位姿估计、无人机位姿估计 文章类型:概念、公式总结(本文不带推导过程,若想了解公式是如何推出来的请自习搜索文献),C++函数展示 @Author:VShawn(singlex@foxmail.com) @Date:2016-11-04 @Lab: CvL 阅读全文
posted @ 2016-11-07 00:23 V·Shawn 阅读(8414) 评论(1) 推荐(1) 编辑
摘要: 本文主要介绍在空间坐标系下,某一点绕xyz三个轴的旋转公式,以及某点绕任意轴旋转的公式,所有公式都有提供相应的C++代码,方便大家快速调用。 阅读全文
posted @ 2016-11-05 11:35 V·Shawn 阅读(19325) 评论(4) 推荐(4) 编辑
摘要: 本文将告诉你当求出相机或者飞行器的旋转矩阵后,如何根据旋转矩阵,计算出x、y、z三个轴方向的旋转角度。 阅读全文
posted @ 2016-11-04 23:56 V·Shawn 阅读(27140) 评论(4) 推荐(0) 编辑
摘要: 本篇懒得排版,直接在网页html编辑器编辑 在图像处理时,我们常常需要求出图像的直方图、灰度平均值、灰度的方差,这里给出一个opencv2+自带程序,实现这些功能。 直方图 对于直方图,使用cv::calcHist函数可以求出。 原型 void calcHist(const Mat* arrays, 阅读全文
posted @ 2015-09-26 18:06 V·Shawn 阅读(9967) 评论(0) 推荐(0) 编辑
摘要: .NET WebBroswer内存释放 阅读全文
posted @ 2015-07-19 10:37 V·Shawn 阅读(517) 评论(0) 推荐(0) 编辑
点击右上角即可分享
微信分享提示