opencv-3.4.3 交叉编译并且移植到高通820开发板(包括Qt 5.11.2部分交叉编译及移植),NEON OpenCV编译

原文我是用有道笔记记录的,下面排版不是很好,可参看有道笔记原文:http://note.youdao.com/s/7klAa21x

1.下载opencv-3.4.3 的SRC : https://github.com/opencv/opencv/archive/3.4.3.zip
2.解压,并创建外部构建目录 build
3.使用 cmake-gui 图形化界面来配置交叉编译工具参数,参考博文:https://blog.csdn.net/Guet_Kite/article/details/78667175
与此博文中操作不同处在:我这里建两个文件夹来存放配置和安装路径:

 (1) source code目录选择的是opencv-3.4.3解压的目录(2) Where to build the binaries:选择的是在opencv-3.4.3目录下创建的build子目录(外部构建目录)

接着就是选择编译工具链了,参考博文用的是友善的4.4.3的工具链,Compliers写的是交叉编译工具 arm-linux-gcc、arm-linux-g++
Target Root写的是交叉编译工具 arm-linux-g++/gcc 的所在包含文件夹
我这里820ADP选择的交叉编译工具是:gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu
该工具在T430笔记本电脑下的目录是:/usr/local/bin/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu

然后中间红色的配置里:
取消WITH_GTK
取消WITH_TIFF
选择WITH_QT

参考的博文中, 进行了上述的设置, 我前期编译的时候没有勾选 WITH_QT 因为我开发电脑T430上没有交叉编译Qt, 如果选中WITH_QT选项,Configure会报错,不选择不报错。
{后期必须要选择Qt作为显示图形界面的工具,不能使用GTK来显示,820板子上移植GTK很麻烦!}
说明: WITH_QT 的目的在于: opencv交叉编译移植到ARM板上后, opencv需要使用一些窗口类 (例如imshow时候需要调用窗口), 但是交叉编译的opencv是没有窗口类支持的, 在x86环境下opencv是可以调用ubuntu原生窗口的, 所以 WITH_QT 的目的给ARM板上的opencv提供窗口类支持, WITH_GTK是GTK窗口类, 看很多博客表示: GTK类的移植很复杂, 大部分都采用QT窗口类.

然后点击cmake-gui界面中的Configure,该gui界面就会自动在opencv-3.4.3/build目录下创建makefile等文件(基于ARM架构的makefile文件)
该博文参考至此,后面就没有看了。

只是纯粹编译OpenCV, 取消勾选WITH_QT编译时遇到的问题 (WITH_QT编译选项后面会提到)
[1]在build目录下 sudo make 进行build,T430环境中报错:找不到 zlib.h头文件定义
解决办法:在T430根目录下: find / -name zlib.h
有几个目录中会有zlib.h文件,最后选择 /usr/include/zlib.h ,将其cp到 /usr/local/bin/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/lib/gcc/aarch64-linux-gnu/6.3.1/include 路径下,为什么是这个路径解释如下:

交叉编译头文件找不到:【2.如果是应用程序,采用交叉编译】,编译时没有使用-I选项指定包含目录的话,那么默认的头文件搜索路径为/usr/local/arm/2.95.3/arm-linux/include,即交叉编译器的安装目录下的include目录,执行如下命令
https://blog.csdn.net/davion_zhang/article/details/45075685
echo ‘main(){}’ | aarch64-linux-gnu-gcc -E -v -
可以看到如下的输出结果:
可以看到上面有写 #include <…> search starts here: 的搜索路径
如果在交叉编译的时候遇到找不到头文件的问题,可以把对应的头文件拷贝到使用的交叉编译工具 所 指定的include 搜索路径里面。

[2]在build路径下build还遇到过:找不到 zconf.h 头文件,操作方法和上面一样,找的T430环境中的:/usr/include/zconf.h 这个目录中的zconf.h 文件,同样也是cp到include路径。

**[3] 然后交叉编译就没有再遇到缺少头文件的问题了,之后在make过程中报错:…/…/lib/libopencv_imgcodecs.so.3.4.3:**对‘png_init_filter_functions_neon’未定义的引用,此问题较为棘手,解决办法如下:
主要参考博文:https://blog.csdn.net/zhoudekuai/article/details/62425566 以及该博文指向的链接:https://github.com/opencv/opencv/issues/7600
/opt/opencv-3.4.3/3rdparty/libpng$ gedit CMakeLists.txt
在该CMakeLists.txt 最开头部分添加:set(ENABLE_NEON ON)#YZW_added
返回build目录,继续执行make -j8 但是依然报:‘png_init_filter_functions_neon’未定义的引用 错误,参考另外一篇博文:https://blog.csdn.net/weixin_42330265/article/details/80484978
/opt/opencv-3.4.3/3rdparty/libpng$ gedit pngpriv.h
把pngpriv.h 中的:# if (defined(ARM_NEON) || defined(__ARM_NEON)) && \ 行删除,换成:# if defined(PNG_ARM_NEON) && (defined(ARM_NEON) || defined(__ARM_NEON)) && \ 注意要 # 不是表示注释!

然后在build目录下make -j8 好像还是报了错误?我又参看:https://github.com/opencv/opencv/issues/7600 下面的,把libpng12-dev remove了,然后就可以交叉编译完成了,不再报错。
sudo apt-get -y remove libpng12-dev
mkdir build
cd build
cmake …
make -j opencv_test_imgproc
注意:make -j opencv_test_imgproc命令只是在build/bin目录下生成一个opencv_test_imgproc可执行文件。可以file 一下这个文件,看是不是arm可执行文件。
最后完整的是操作:在build目录下make -j8
参考博文:https://blog.csdn.net/jd404647184/article/details/45745535?locationNum=11&fps=1
11.进入构建的目录,我的是opencv-arm目录下,运行make,各忙各的思密达。
12.终于100%了,然后还在这个目录下运行make install,如果安装成功不会报错,到安装目录下看lib下是否有.so文件,运行file xxxxxx.so看看是不是支持arm的共享库,是的话编译就基本成功了。

然后就是把交叉编译好的opencv移植到开发板上去,具体的操作如下:
测试没问题的移植过程:
1.将安装目录下/lib/*所有文件拷到开发板/lib下,不要改路径,必须在/lib下。容量不足的可以只拷运行需要的文件
把T430 /opt/opencv-3.4.3/build/lib 下面所有的.so文件 拷贝到 开发板的 root@8x96auto:/lib64# ls 目录下面,注意这个拷贝,原来/opt/opencv-3.4.3/build/lib目录中的很多软链接会失效,我采用的是笨办法,在820ADP上挨个创建需要链接的软链接。
2.把安装目录下/bin/*拷到开发板/bin下,这一步可以不要
把T430 /opt/opencv-3.4.3/build/bin 下面的所有交叉编译出来的可执行文件都cp到开发板的 /bin64 目录下面。{bin 目录中的文件肯呢个暂时先永不到,只需要lib里面的文件就可以了}

[问题1] 提示找不到.so动态库
板子重新上电运行交叉编译好的opencv demo可执行文件:DisplayImage 如果提示找不到对应的.so 文件,但是在/lib 路径下面能找到这个文件,则说明DisplayImage运行时要调用的环境变量位置没有设置,这个设置通过修改 vi/etc/ld.so.conf 这个文件,把这个动态库对应的路径写入这个文件中就可以了,如下所示:

最后运行生效:sudo ldconfig 就能解决这个问题了。
参考文档:https://blog.csdn.net/cv_you/article/details/77341631

[问题2] 提示找不到GLIBCXX_3.4.22
在板子上运行 ./DisplayImage 提示: libstdc++.so.6: version `GLIBCXX_3.4.22’ not found 可以参看这个帖子:https://blog.csdn.net/pursuit_zhangyu/article/details/79450027
最后在T430 的 /usr/local/bin/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/lib64$ 目录下找到 libstdc++.so.6.0.22 这个动态库,且这个动态库是ARM架构的,直接cp到820ADP板子的/usr/lib64/路径下面,并把libstdc++.so.6.0.21删除(或者重新命名作为备份),再把当前目录下的libstdc++.so.6和libstdc++.so这两个软链接指向新cp过来的 libstdc++.so.6.0.22 这个动态库就可以了。
/usr/lib64/libstdc++.so.6.0.21 (需要链接的文件)
/usr/lib64/libstdc++.so.6 (软链接)
/usr/lib64/libstdc++.so (软链接)

[问题3] 提示需要安装libgtk2.0-dev 和 pkg-config,如下所示:

在820板子上运行报错如上所示。
此问题比较麻烦,查询多次,最后确定 https://blog.csdn.net/Guet_Kite/article/details/78667175 (如这个帖子中所示),这个帖子中说明的原因是:开发板上缺少GTK/QT 这类图形显示功能。毕竟GTK不好搞。
yzw总结原因:opencv交叉编译已经ok了,make install 之后安装到指定的PC路径下面(/opt/opencv-3.4.3/release/lib_opencv-3.4.3),这个路径里面的 lib 可以直接移植到开发板lib64里面,这样就完成移植了。报上面错误的原因是:opencv 使用的时候需要调用到 GUI 窗口类,在交叉编译opencv的时候,没有勾选GTK的窗口类(或者勾选了GTK的窗口类),在板子上面没有办法调用GTK窗口类,所以可以认为:opencv把图像是处理好了,但是还不能使用窗口显示。
看了一些博文,均表示:板子上移植GTK较为困难,移植QT作为窗口显示类比较简单,于是下面开始QT的交叉编译以及移植。
QT交叉编译之后不需要将qt安装路径下的lib和plungs文件夹移植在820 /usr/lib64路径下面,820板子烧录系统之后,自带有QT的窗口类支持,自带的QT的so文件和plungs文件都在/usr/lib64 路径下面,千万不能把交叉编译后的qt lib移植到 /usr/lib64 路径下面,这样子会造成对原来qt库的覆盖。
如何看烧录系统里面是否有对应Qt的支持,可以打开烧录的img文件,将该文件挂载到某个位置,里面会显示根文件系统(rootfs),在根文件系统的: /usr/lib64  路径下面,会有QT的.so文件的。

首先需要下载Qt的source code,这里采用的是Qt-5.11.2的版本。下载之后的包是这个名字: qt-everywhere-src-5.11.2.tar.xz
下载好之后,解压文件,在/home/yzw/programfiles/Qt/qt-everywhere-src-5.11.2 目录下面有 README 文件,这个文件里面简单描述了如何编译 Qt source code,但是这个编译只是x86 平台的编译,README文件中简要的编译内容如下所示:
Linux, Mac:

 cd <path>/<source_package>./configure -prefix $PWD/qtbase <license> -nomake testsmake -j 4

只要在/home/yzw/programfiles/Qt/qt-everywhere-src-5.11.2 目录下执行:./configure -prefix $PWD/qtbase -opensource -nomake tests 即能完成x86平台编译的配置情况。配置情况设置好了之后会有提示的信息,告诉我们:make 之后不需要make install,make 之后会直接install的 。然后执行 sudo make -j8 就能编译并完成安装了。
但是,问题1:这里不知道install的路径是哪里。如何能知道呢。
直接编译安装x86平台代码后,我重新配置cmake-gui 设定Qt5的的路径,然后在/opt/opencv-3.4.3/release 目录下面生成交叉编译的Makefile,然后sudo make -j8 ,注意,这样子编译会报错,报错信息大体是:有一个QT路径下的.so链接不成功,提示:文件格式错误。这是因为我们这里使用交叉编译opencv的source code,此过程中需要链接qt编译好的lib 文件,由于opencv是交叉编译,所以链接的qt的.so文件显然应该是ARM架构的,而不是x86的。所以上面编译Qt作为x86平台的方法是不合理的。

解决这个问题的办法:交叉编译Qt5 Source Code。交叉编译的指南可以参看Qt官方给的内容:http://doc.qt.io/qt-5/build-sources.html
参看这个文档中的config不通过:设置config的情况以及报错的情况如下图所示:
./configure -release -opengl es2 -device linux-arm-generic-g++ -device-option CROSS_COMPILE=/usr/local/bin/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu- -no-gcc-sysroot -prefix /home/yzw/programfiles/Qt/yzw_qt_rootfs/qt5

由于官方文档总是config设置不过去,于是我参考了网上Qt交叉编译的博文,参考博文:https://blog.csdn.net/a18373279153/article/details/78683085
修改了/home/yzw/programfiles/Qt/qt-everywhere-src-5.11.2/qtbase/mkspecs/linux-arm-gnueabi-g++ 路径下面的qmake.conf文件,修改的文件如下所示:注意!这里需要指定绝对路径,如果只写aarch64-linux-gnu-gcc 后续交叉编译qt会报错,提示找不到交叉编译工具。

上面的 qmake.conf 文件设置好后,可以开始配置,如上面链接博文所示。 最后config过程指令如下所示:
./configure -release -nomake examples -no-iconv -no-opengl -no-assimp -no-qt3d-profile-jobs -no-qt3d-profile-gl -xplatform linux-arm-gnueabi-g++ -prefix /home/yzw/programfiles/Qt/yzw_qt_rootfs/qt5 -opensource -confirm-license
注意!上面这个绿色的不是交叉编译器的名字,是修改qmake.conf文件的那个目录,这个是指定的config文件的目录名字。
/home/yzw/programfiles/Qt/yzw_qt_rootfs/qt5 这个是make之后,最后安装qt的位置。
然后配置完成,sudo make -j8 ; sudo make install 完成安装,此时/home/yzw/programfiles/Qt/yzw_qt_rootfs/qt5 目录下面会有安装的bin lib 等文件。
到这里,qt的交叉编译工作完成了。

现在本地x86环境下有交叉编译的Qt lib,可以进行cmake-gui的设置,配置情况如下:
参看:https://blog.csdn.net/Guet_Kite/article/details/78667175 博文。注意:搜索GTK,需要把GTK相关的都取消掉,一共有两个一个是WITH_GTK WITH_GTK_2_X,把with_qt勾选上。并且完成路径设置,注意这里的路径都是/home/yzw/programfiles/Qt/yzw_qt_rootfs/qt5 安装路径下面的lib

上图,设置opencv交叉编译完成后,make install 的路径,到时候opencv会安装在这个路径里面。

然后Configure,看有没有报一些比较严重的错误,若没有就Generate。此时在 /opt/opencv-3.4.3/release 路径下面会创建 makefile文件,这个makefile文件是基于ARM架构的。然后 sudo make -j8 完成编译后,sudo make install 最后会安装在:/opt/opencv-3.4.3/release/lib_opencv-3.4.3 这个目录里面。
这个路径里面。然后把此路径下面的lib文件移植到820板子的lib64 路径下面,就完成了opencv的移植。

opencv-3.4.3 交叉编译并且移植到高通820开发板(包括Qt 5.11.2部分交叉编译及移植),NEON OpenCV编译相关推荐

  1. 移植安装ModBus到ARM开发板

    1.libmodbus官网 2.下载 二.交叉编译 1.解压 2.创建安装目录 3.进入解压的目录 4.配置编译选项 5.编译 6.安装 7.生成动态链接库 三.移植到ARM开发板 1.复制文件到AR ...

  2. 三星官方smdkv210 uboot移植到我的s5pv210开发板

    北京 2020-7-26 19:44 周日 昨天外面闷热 今日凉快.空调一开啥事没有!O(∩_∩)O 用了差不多两个周末蹲家里移植的.进度比较慢,算是把uboot相关的一些东西基本了解了. uboot ...

  3. QT开发环境的建立以及qte4.6.3、tislib1.4移植到博创star2410开发板

    1.首先是建立Linux开发环境 1.1.在windowsXP下安装博创公司提供的虚拟机软件VMware Workstation,版本为VMware-workstation-full-7.0.1-22 ...

  4. 移植QT5.9到嵌入式开发板(详细)

    移植QT5.9到嵌入式开发板 1.硬件平台 2.软件平台介绍 Linux操作系统 移植的要求 3.源码下载与编译 交叉编译器 4.系统烧录 制作SD卡烧录 命令行烧录 Nandflash启动OK335 ...

  5. opencv 移植到迅为IMX6开发板

    OpenCV 是目前开源项目中最著名的基于机器视觉方向的图像处理的开发包,目前已经有被移植到嵌入式 Linux 环境上.本文介绍了 OpenCV 交叉编译的基本步骤. 一.编译环境及库文件 linux ...

  6. (二)arm-a上华为iot云,移植虚拟机的文件到开发板,全网首发

    上一篇文章已经在虚拟机上可以用华为的sdk连接到iot云端 我已经造好轮子,也不收费,希望大家多交流,每次下载点东西,一个两个都要金币的,很难受 我造好的轮子 现在我们把文件移植到开发板上 进行文件的 ...

  7. tiny4412搭建linux开发环境,[Tiny4412] 移植 Linux4.4 到 Tiny4412 开发板上

    一. 前言 一直以来都是基于 Linux-2.6 内核学习嵌入式,但是工作之后发现,主流的 kernel 早已经不再使用 platform device 结构去描述设备信息了,而是换成了更为简洁的 d ...

  8. 首发 成功移植OpenHarmony到龙芯开发板,代码开源

    通过一周的时间,我们成功地将OpenHarmony 3.0移植到智龙开发板上,板载芯片1C300B. 1C300是龙芯基于 GS232 处理器核的高性价比单芯片系统,内置浮点处理单元,支持多种类型内存 ...

  9. LVGL的PC端移植和STM32F429阿波罗开发板移植

    LVGL 8.1_学习总结 LVGL介绍 LVGL开发环境 LVGL的GitHub的代码介绍 LVGL8.1 在F429上面的移植 准备 修改lv_port_disp.c文件中的 修改lv_port_ ...

最新文章

  1. Java项目:学生管理系统(无库版)(java+打印控制台)
  2. 《分布式服务架构:原理、设计与实战》第二章彻底解决分布式系统一致性的问题...
  3. C#一种最简单实用安全的单例模式,也是线程安全的
  4. JS获取本周、本季度、本月、上月的开端日期、停止日期
  5. springboot定时发送短信_阿里大于可以发送定时短信
  6. [转帖] 职场学习=贼学技术
  7. 疯狂的程序员——个人解读加经典语录
  8. restlet和ajax,使用Web测试插件Restlet Client发送Get和Post请求的方法教程
  9. SQLyog使用技巧
  10. 方舟生存进化秘籍大全
  11. 智慧电力信息化系统建设整体方案
  12. CCF计算机软件能力认证试题练习:201903-2 二十四点
  13. “IndentationError: unindent does not match any outer indentation level“ 错误解决
  14. 比例电磁阀的工作原理
  15. 最全面的Microsoft Office下载
  16. 微信小程序 - 音乐播放器源码
  17. 前端基础_像素的处理
  18. 微服务分布式架构中,如何高效收集请求/响应日志
  19. 圆透视变换为椭圆,其缩放比例如何求?
  20. Day134-136.尚品汇:平台属性接口、SPU、跨域问题、配置持久化、MinIO 分布式文件存储系统

热门文章

  1. 在PDF文键中关键字怎样查找
  2. 【Wifi签到APP】大学生的一次完整的中小型项目的编码经历
  3. 长沙it培训价格是多少
  4. mnist数据集常见格式.pkl.gz版本的下载与读取
  5. 【博客420】arp代理与arp代答
  6. java解包_Java的自动封包和解包(Autoboxing和AutoUnboxing)
  7. 现代信号分析与处理简答题期末总结BISTU
  8. 开关插座手册_如何用开关/插座组合替换电灯开关
  9. Python课堂练习3
  10. (微信小程序毕业设计)基于微信小程序便捷记账系统