【ZYNQ】基于ZYNQ 7020的OPENCV源码交叉编译

目录

安装准备

检查编译器

安装OpenCV编译的依赖项

下载OpenCV源码

下载CMake

编译配置

编译器说明

参考链接


安装准备

使用的各个程序的版本内容如下:

类别

软件名称

软件版本

虚拟机

VMware

VMware-workstation-full-15.5.0-14665864

操作系统

Ubuntu

16.04.6 LTS

编译器

arm-linux-gnueabihf-gcc

/

CMAKE

Cmake

3.18.0-Linux-x86_64

源码

OpenCV源码

opencv-3.4.10

检查编译器

在Ubuntu的命令行中执行以下命令,检查交叉编译器的版本:

arm-linux-gnueabihf-gcc -v

arm-linux-gnueabihf-g++ -v

如果输出显示有error,说明还没有安装交叉编译器。

输入以下指令进行安装,注意编译器以hf结尾,不要与其他编译器件混淆:

sudo apt-get install gcc-arm-linux-gnueabihf

sudo apt-get install g++-arm-linux-gnueabihf

安装完成后,再次检查交叉编译器的版本,如果有下图的输出,则代表安装完成:

编译器arm-linux-gnueabihf-gcc容易与arm-linux-gnueabi-gcc相混肴(后者缺少hf),两者的区别在于适用的架构不同,arm-linux-gnueabihf-gcc适用于armhf架构,arm-linux-gnueabi-gcc适用于armel架构, armel和armhf这两种架构的区别在对待浮点运算采取了不同的策略(zynq 7000是armhf架构):

gcc的选项-mfloat-abi有三种值soft,softfp,hard(其中后两者都要求arm里有fpu浮点运算单元,soft与后两者是兼容的,但softfphard两种模式互不兼容)
soft : 不用fpu进行浮点计算,即使有fpu浮点运算单元也不用,而是使用软件模式。
softfp : armel架构(对应的编译器为gcc-arm-linux-gnueabi)采用的默认值,用fpu计算,但是传参数用普通寄存器传,这样中断的时候,只需要保存普通寄存器,中断负荷小,但是参数需要转换成浮点的再计算。
hard : armhf架构(对应的编译器gcc-arm-linux-gnueabihf)采用的默认值,用fpu计算,传参数也用fpu中的浮点寄存器传,省去了转换, 性能最好,但是中断负荷高。

使用arm-linux-gnueabi编译OpenCV动态库,开发板端程序运行时加载OpenCV动态库会出现internal error问题。选错编译器的问题在后期才出现错误提示,因此最好在OpenCV源码的编译阶段就确定编译器选择正确。

安装OpenCV编译的依赖项

执行以下命令,安装OpenCV编译的依赖项

sudo apt-get install build-essential cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev

以下是编译OpenCV非必须的项目,在编译界面增加选项后才可能会提示缺少,根据需要进行安装:

sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev

下载OpenCV源码

OpenCV源码的下载位置可以在OpenCV的官网找到,本文下载的版本为3.4.10:

https://opencv.org/releases/

官网打不开的话尝试从github下载:

https://github.com/opencv/opencv/releases/tag/3.4.10

下载Source code,下载完成后解压,本文解压至/home/<用户名>/Downloads/opencv/opencv-3.4.10文件夹:

下载CMake

通过以下网址下载Cmake,gui版本操作会更方便一些,本文下载的版本是cmake-3.18.0-Linux-x86_64.tar.gz:

https://cmake.org/download/#previous

下载完成后解压,本文解压位置在/home/<用户名>/Downloads/opencv/cmake-3.18.0-Linux-x86_64/:

  • 编译配置

(1)双击执行/home/<用户名>/Downloads/opencv/cmake-3.18.0-Linux-x86_64/bin目录下的cmake-gui文件,打开cmake图形化编译界面:

在cmake-gui窗口上方“Where is source code”栏中填入opencv源码文件夹,在“Where to build the binaries”栏中填入你期望的存放opencv源码编译文件的build文件夹,本文选择的文件夹为:

源码文件夹:/home/<用户名>/Downloads/opencv/opencv-3.4.10

build文件夹:/home/<用户名>/Downloads/opencv/hf_opencv_build

(2)点击Cmake窗口左侧的Configure按钮,出现新窗口CMakeSetup:

如果没有出现新窗口,是因为上次编译的缓存还在,点击Cmake窗口左上角File,执行Delete Cache,缓存清楚完成后再次点击Configure按钮即可:

CMakeSetup窗口中修改为第4项Specify options for cross-compiling,点击Next:

(3)参考表格进行填写:

选项

填写内容

Operating System

Linux

Processor

arm

Compilers

C:

/usr/bin/arm-linux-gnueabihf-gcc

C++:

/usr/bin/arm-linux-gnueabihf-g++

Target Root

无强制要求

有部分博客的Operating System填写的是arm-linux,经过实践,Cmake无法识别,必须填写Linux。

Target Root在网上并没有统一说法,有填写第三方库的,有填写Compilers的上一级目录的,本文填写的是/usr/bin文件夹。

之后点击Finish即可。

(4)之后会出现OpenCV的配置项:

本文在Search栏中搜索install,修改CMAKE_INSTALL_PREFIX配置项。CMAKE_INSTALL_PREFIX配置项决定了OpenCV库的安装位置,选择自己期望的位置即可。本文选择/home/<用户名>/Downloads/opencv/hf_opencv_install:

继续搜素png。有部分教程要求去掉配置项中PNG相关的选项,否则OpenCV会发生错误,本文没有试验,直接去除了WITH_PNG选项。

继续搜素world。选择该选项会将OpenCV动态库整合,CMAKE_INSTALL_PREFIX目录下的lib文件夹下会生成单独的libopencv_world动态库,而不是一系列分立的OpenCV功能库,由于产品不需要全部的OpenCV功能,后续需要去除部分OpenCV功能库,因此该选项不勾选:

选项配置完成后,点击Generate,等待生成完成。

(5)

生成完成后,打开“Where to build the binaries”文件夹,本文的文件夹为/home/<用户名>/Downloads/opencv/hf_opencv_build。

在文件上右键使用gedit方式打开文件夹下的CMakeCache.txt文件,大约326行找到

CMAKE_EXE_LINKER_FLAGS:STRING=

 将其修改为如下并保存文件:

CMAKE_EXE_LINKER_FLAGS:STRING=-pthread -lrt -ldl

在/home/<用户名>/Downloads/opencv/hf_opencv_build文件夹中右键打开命令行,执行make指令:

   make -j12

//12表示线程数量,CPU性能较差的电脑12可换为更小的数字或不加-j12

make没有错误的话,继续执行make install指令:

   make install

make install完成后,可以在CMAKE_INSTALL_PREFIX配置项设定的文件夹下找到编译完成的OpenCV库:

lib/下就是各个.so动态库文件:

  • 编译器说明

关于编译配置章节第(3)步中的C/C++编译器,本文在开发时,设想了3种选择,其中前2种可行。

第一种就是本文选择的arm-linux-gnueabihf-gcc,来源是Ubuntu安装的apt-get install 。

第二种是,在Ubuntu系统下安装Vitis 2020.1,安装完成后在下列目录中可以查找到Xilinx Vitis提供的编译器:

/Xilinx/Vitis/2020.1/gnu/aarch32/nt/gcc-arm-linux-gnueabi/bin/arm-linux-gnueabihf-gcc

/Xilinx/Vitis/2020.1/gnu/aarch32/nt/gcc-arm-linux-gnueabi/bin/arm-linux-gnueabihf-g++

经过验证,使用该编译器也可以成功编译OpenCV。本文没有选择Xilinx Vitis提供的编译器的原因在于,虚拟机空间不足以安装Vitis,因此尝试编译Qt源码时选择的是第一种,之后为了避免潜在的冲突错误,编译OpenCV时同样选择了第一种。有兴趣的读者可以尝试使用Xilinx Vitis提供的编译器来编译Qt源码。

第三种选择是使用petalinux提供的编译器,可惜的是此步骤并未走通。产品使用的image.ub由petalinux提供的编译器编译,而程序和OpenCV动态库由arm-linux-gnueabihf-gcc编译,两者编译器的来源不同,因此是存在不能兼容的可能性的。

按照常规想法,image.ub中的官方库是由petalinux编译而成,如果程序和动态库也使用该编译器,那么可以肯定动态库和Linux系统之间出现冲突的可能性是最低的。

本文使用的petalinux的编译器在sdk.sh的安装位置:

/opt/petalinux/2020.1/sysroots/x86_64-petalinux-linux/usr/bin/arm-xilinx-linux-gnueabi/arm-xilinx-linux-gnueabi-gcc

/opt/petalinux/2020.1/sysroots/x86_64-petalinux-linux/usr/bin/arm-xilinx-linux-gnueabi/arm-xilinx-linux-gnueabi-g++

根据链接Install Xilinx Tools - Xilinx Wiki - Confluence (atlassian.net)

petalinux编译器arm-xilinx-linux-gnueabi-gcc使用的是软浮点数,同样可用于zynq 7000架构。

之后,petalinux编译器在编译OpenCV时出现了错误,经过了一些尝试后,由于时间关系没有解决这个问题:

本文在项目后期进行回顾时,猜测错误的原因是是petalinux生成sdk.sh时rootfs中未选择ldd选项,有兴趣的读者可以重新生成sdk.sh并尝试能否正确编译OpenCV源码:

如果这petalinux编译器这条线能够走通,好处是显而易见的。

系统镜像、动态库、程序都可以使用petalinux编译的这一套编译工具,不存在冲突问题。

同时,在编译配置章节中,Target Root就可以选择sdk.sh安装目录下的usr/lib/文件夹。假设编译OpenCV时需要第三方库,比如tiff、x264等,只需要在petalinux的rootfs中选择并生成sdk.sh,然后Target Root选择sdk.sh安装目录,编译器选择petalinux编译器即可。如果使用Ubuntu提供的arm-linux-gnueabihf-gcc编译器,那么需要下载第三方库的源码,再手动进行编译,可能需要解决潜在的冲突问题,第三方库较多时,也比较繁琐。

  • 参考链接

【1】https://blog.csdn.net/KayChanGEEK/article/details/78552418

【2】

https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18842547/Install+Xilinx+Tools?responseToken=05cf01333fed60ac4bb10b91964f07d9b

【3】https://blog.csdn.net/qq_38880380/article/details/80987661

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/482069.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【QT入门】 Qt实现自定义信号

往期回顾&#xff1a; 【QT入门】图片查看软件(优化)-CSDN博客 【QT入门】 lambda表达式(函数)详解-CSDN博客 【QT入门】 Qt槽函数五种常用写法介绍-CSDN博客 【QT入门】 Qt实现自定义信号 一、为什么需要自定义信号 比如说现在一个小需求&#xff0c;我们想要实现跨ui通信&a…

Hive入门

什么是hive&#xff1f; - Hive是Facebook开发并贡献给Hadoop开源社区的。它是建立在 Hadoop体系架构上的一层 SQL抽象&#xff0c;使得数据相关人 员使用他们最为熟悉的SQL语言就可以进行海量数据的处理、 分析和统计工作 - Hive将数据存储于HDFS的数据文件映射为一张数据库…

Java程序设计 4、5章 练习题

一、填空题 1.假设有 String s1 "Welcome to Java"; String s2 s1; String s3 new String("Welcome to Java"); 那么下面表达式的结果是什么&#xff1f; (1) s1 s2 ___________true_______________ (2) s1 s3 ______…

SOPHON算能服务器SDK环境配置和相关库安装

目录 1 SDK大包下载 2 安装libsophon 2.1 安装依赖 1.2 安装libsophon 2 安装 sophon-mw 参考文献&#xff1a; 1 SDK大包下载 首先需要根据之前的博客&#xff0c;下载SDK大包&#xff1a;SOPHON算能科技新版SDK环境配置以及C demo使用过程_sophon sdk yolo-CSDN博客 …

第 6 章 ROS-xacro练习(自学二刷笔记)

重要参考&#xff1a; 课程链接:https://www.bilibili.com/video/BV1Ci4y1L7ZZ 讲义链接:Introduction Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程 6.4.3 Xacro_完整使用流程示例 需求描述: 使用 Xacro 优化 URDF 版的小车底盘模型实现 结果演示: 1.编写 X…

idea使用token方式登录GitHub

总体上分为两大步&#xff1a;1.GitHub生成token。2.idea配置token登录GitHub。 注&#xff1a;idea配置GitHub的前提是本地已经安装了git程序。 一、GitHub生成token 1.登录GitHub 2.进入token创建页面&#xff08;右上角点击头像–>settings–>页面向下滚动左侧菜单栏…

linux热键,man手册介绍

目录 热键 tab ctrl c ctrl r man 区段 快捷键 热键 tab 可以看到以输入的内容为开头的指令,但无法选择: 当输入的内容匹配到的内容只有一个时,可以自动补全 可以用于输入路径时,自动补全文件名 ctrl c 让当前的程序停掉,可以在 程序或指令出问题而自己无法停止时 使用…

HSP_01章_Python 语言概述

文章目录 06 开发环境安装10 注意事项11 学习方法14 Pycharm 常用快捷键14 Python 常用转义字符15 Python 注释Comment16 [Python 中文文档地址](https://docs.python.org/zh-cn/3.11/) 06 开发环境安装 python 版本命令: python cmd 退出: exit() 环境变量配置: 计算机 > 高…

【Linux】从零认识进程 — 中下篇

送给大家一句话&#xff1a; 人一切的痛苦&#xff0c;本质上都是对自己无能的愤怒。而自律&#xff0c;恰恰是解决人生痛苦的根本途径。—— 王小波 从零认识进程 1 进程优先级1.1 什么是优先级1.2 为什么要有优先级1.3 Linux优先级的特点 && 查看方式1.4 其他概念 2…

如何鉴别真假ZLibrary?2024 ZLibrary最新可用地址,持续更新,2024年在 zlibrary 上发现几本有意思的电子书

之前分享过全网电子书都在这了&#xff1a;ZLibrary 官方通道来了&#xff0c;不再担心找不到最新地址&#xff0c;配合这个脚本简直完美&#xff0c;最新ZLibrary可用地址 zlibrary-sg.se 如何确认一个网站是真的ZLibrary &#xff1f;存在一个API 接口/eapi/info &#xff0…

pytest全局配置+前后只固件配置

pytest全局配置前后只固件配置 通过读取pytest.ini配置文件运行通过读取pytest.ini配置文件运行无条件跳过pytest.initest_mashang.pyrun.py 有条件跳过test_mashang.py pytest框架实现的一些前后置&#xff08;固件、夹具&#xff09;处理方法一&#xff08;封装&#xff09;方…

【C++航海王:追寻罗杰的编程之路】stack

目录 1 -> stack的介绍和使用 1.1 -> stack的介绍 1.2 -> stack的使用 1.3 -> stack的模拟实现 1 -> stack的介绍和使用 1.1 -> stack的介绍 stack的文档介绍 1. stack是一种容器适配器&#xff0c;专门用在具有后进先出操作的上下文环境中&#xff0c…

MTransE翻译

MTransE翻译 阅读时间&#xff1a;2024.03.23 领域&#xff1a;知识图谱&#xff0c;知识对齐 作者&#xff1a;Muhao Chen等人 UCLA 出处&#xff1a;IJCAI Multilingual Knowledge Graph Embeddings for Cross-lingual Knowledge Alignment 用于交叉知识对齐的多语言知识图…

基于java+springboot+vue实现的外卖平台系统(文末源码+Lw+ppt)23-568

摘 要 伴随着我国社会的发展&#xff0c;人民生活质量日益提高。于是对外卖平台系统进行规范而严格是十分有必要的&#xff0c;所以许许多多的信息管理系统应运而生。此时单靠人力应对这些事务就显得有些力不从心了。所以本论文将设计一套外卖平台系统&#xff0c;帮助商家进…

鸿蒙实战开发-如何通过拖动滑块调节应用内字体大小

介绍 本篇Codelab将介绍如何使用基础组件Slider&#xff0c;通过拖动滑块调节应用内字体大小。要求完成以下功能&#xff1a; 实现两个页面的UX&#xff1a;主页面和字体大小调节页面。拖动滑块改变字体大小系数&#xff0c;列表页和调节页面字体大小同步变化。往右拖动滑块字…

飞企互联-FE企业运营管理平台uploadAttachmentServlet 任意文件上传漏洞

产品简介 飞企互联-FE企业运营管理平台是一个基于云计算、智能化、大数据、物联网、移动互联网等技术支撑的云工作台。这个平台可以连接人、链接端、联通内外&#xff0c;支持企业B2B、C2B与O2O等核心需求&#xff0c;为不同行业客户的互联网转型提供支持。其特色在于提供云端…

【软件测试】探索和学习在模型中的软件测试

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法|MySQL| ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-JIGESSc1ecUpVUnH {font-family:"trebuchet ms",verdana,arial,sans-serif;f…

C++初阶---类和对象

目录 1. 类的引入 2. 类的定义 4. 类的访问限定符及封装 4.1 访问限定符 4.2 封装 5. 类的作用域 6.类的实例化 7.类对象模型 8. this指针 8.1 this指针的引出 8.2 this指针的特性 8.3 C语言和C实现栈的对比 9.类的六个默认成员函数 10&#xff0c;构造函数 10.1…

基于springboot+vue的餐饮管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…