Ubuntu下交叉编译工业相机库aravis到OpenHarmony(aarch64)使用

文章目录

  • 下载交叉编译工具链
  • 安装meson
  • 编写交叉编译配置文件
  • 编译glib
  • 编译libiconv
  • 编译libxml2
  • 编译libusb(暂时不编译,依赖的udev库我找不到)
  • 编译Aravis
  • 使用

自行编译的库都统一放到一个地方去,这样引用时方便一些,比如我源码放到OpenHarmony这里,而编译后install的东西放到OpenHarmony/install这里
在这里插入图片描述

下载交叉编译工具链

我的目标设备是aarch64架构的,所以我下载这个交叉编译工具链
https://releases.linaro.org/components/toolchain/binaries/latest-7/aarch64-linux-gnu/
在这里插入图片描述
解压后放在某个文件夹,并且将对应的路径添加到当前用户的.bashrc中,添加完后,还得记得source一下生效。

在这里插入图片描述
设置完之后,就可以直接通过aarch64-linux-gnu-xxx这样的方式来使用交叉编译工具了,方便。
在这里插入图片描述

安装meson

pip install meson

编写交叉编译配置文件

创建一个cross_aarch.txt,内容如下,后面有用。注意里面使用到的路径

#[constants]
#native_path =  'D:/harmonyOS/OpenHarmony/11/native'
#sysroot_path = 'D:/harmonyOS/OpenHarmony/11/native/sysroot'[host_machine]
system = 'linux'
cpu_family = 'aarch64'
cpu = 'aarch64'
endian = 'little'[properties]
# 这个设置了也没生效
prefix = '/home/yong/Desktop/OpenHarmony/install'
include_directories = ['/home/yong/Desktop/OpenHarmony/install/include']
link_directories = ['/home/yong/Desktop/OpenHarmony/install/lib']
# 指定 pkg-config 的查找路径,貌似没用
#pkg_config_libdir = ['/home/yong/Desktop/OpenHarmony/install/lib/pkgconfig']# 编译glib时,这个组的内容都要注释掉
[built-in options]
c_args = ['-I/home/yong/Desktop/OpenHarmony/install/include']
c_link_args = ['-L/home/yong/Desktop/OpenHarmony/install/lib']
cpp_args = ['-I/home/yong/Desktop/OpenHarmony/install/include']
cpp_link_args = ['-L/home/yong/Desktop/OpenHarmony/install/lib'][binaries]
c = 'aarch64-linux-gnu-gcc'
cpp = 'aarch64-linux-gnu-g++'
ar = 'aarch64-linux-gnu-ar'
ld = 'aarch64-linux-gnu-ld'
objcopy = 'aarch64-linux-gnu-objcopy'
strip = 'aarch64-linux-gnu-strip'
pkg-config = 'pkg-config'

我的这个文件是放在’/home/yong/Desktop/OpenHarmony’这个路径下的,而其他需要编译的源码我也是解压后放这个文件夹,这就意味着后面每个需要用meson来构建的的库,在构建时都可以通过--cross-file ../cross_aarch64.txt来使用这个文件,就不用每个项目配一个了。
在这里插入图片描述

编译glib

下载glib
https://github.com/GNOME/glib/releases/tag/2.78.6
注意下载的glib不要太新,太新的话会报错(但是也不能低于2.59.1,因为meson是从这个版本才引入):

..\glib-2.85.1\meson.build:1:0: ERROR: Meson version is 0.59.2 but project requires >= 1.4.0

在这里插入图片描述
从aravis的meson.build文件,可以看到,大于等于2.52即可
在这里插入图片描述
下载后解压,并且将前面创建的文件拷贝到源码目录下
在这里插入图片描述

执行指令
--prefix指的是编译后的文件的安装路径,需要是绝对路径

meson setup --prefix=/home/yong/Desktop/OpenHarmony/install \
--cross-file ../cross_aarch64.txt builddir \
-Dlibmount=disabled \
-Dselinux=disabled  \
-Dtests=false \
-Dglib_debug=disabled \
-Dnls=disabled

在编译的过程中,会自动下载库;假如下载到一半的然后不下载的话,可能会报对应的子模块中的meson.build不存在,这时需要将子模块的文件夹删除在运行上述一遍指令。

等上面指令执行完,再执行下面指令

 ninja -C builddir/ninja -C builddir/ install

然后在指定的安装位置就得到了编译好的库了

编译libiconv

下载源码
https://www.gnu.org/software/libiconv/#TOCdownloading
在这里插入图片描述

./configure --prefix=/home/yong/Desktop/OpenHarmony/install --host=aarch64-linux-gnu
make
make install

编译libxml2

下载源码
https://github.com/GNOME/libxml2/releases/tag/v2.12.9
libxml2是用cmake构建的
在这里插入图片描述

在这里插入图片描述

添加之前编译的库的安装路径进来

CMAKE_INCLUDE_PATH 
CMAKE_LIBRARY_PATH

在这里插入图片描述
修改安装路径,取消LZMA
在这里插入图片描述
取消python
在这里插入图片描述

勾选Advanced,将以下参数填进去CMAKE_EXE_LINKER_FLAGS(具体路径要以你存放的路径为准)

-L/home/yong/Desktop/OpenHarmony/install/lib -lz -L/home/yong/Desktop/OpenHarmony/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/libc/usr/lib -lm

在这里插入图片描述
然后点击 Configure Generate
然后到build文件夹

make
make install

编译libusb(暂时不编译,依赖的udev库我找不到)

https://github.com/libusb/libusb/releases

因为用到sysroot中的libudev,因此需要指定一下搜索路径

./autogen.sh
./configure

至此,Aravis所依赖的第三方库(glib、libxml2、libiconv等)我们都已经下载源码、编译好后安装到了指定的文件夹。

编译Aravis

下载源码
【Aravis: A vision library for genicam based cameras 】
解压,然后cd 到源码位置

执行指令
将我们前面安装的库的路径告诉系统,不然pkg-config会去本机上面找,找出来的是不对的

export PKG_CONFIG_PATH="/home/yong/Desktop/OpenHarmony/install/lib/pkgconfig"

由于前面的libusb无法编译,只能先禁用aravis对usb设备的支持,也就是编译出来的库只能支持Gige相机

meson setup  builddir -Dviewer=disabled -Dgst-plugin=disabled -Ddocumentation=disabled  -Dusb=disabled -Dintrospection=disabled --cross-file ../cross_aarch64.txt --prefix='/home/yong/Desktop/OpenHarmony/install'

然后编译、安装

ninja -C builddir
ninja -C builddir install

在这里插入图片描述

使用

将整个install文件夹拷贝到Windows平台上,然后再DevEco Studio中使用即可。

在项目的CMakeLists.txt中增加以下代码

# aravis
set(ARAVIS_ROOT "D:/harmonyOS/aravis")
target_include_directories(entry PRIVATE "${ARAVIS_ROOT}/include")
target_include_directories(entry PRIVATE "${ARAVIS_ROOT}/include/aravis-0.8")
target_include_directories(entry PRIVATE "${ARAVIS_ROOT}/include/glib-2.0")
target_include_directories(entry PRIVATE "${ARAVIS_ROOT}/lib/glib-2.0/include")
target_link_directories(entry PRIVATE "${ARAVIS_ROOT}/lib")
target_link_libraries(entry PRIVATE aravis-0.8 xml2)

编译时会报错,说libaravis-0.8.so有问题啥的。
这是因为libaravis-0.8.so是个在linux下的软链接,在windows下可能会有问题。因此要先备份好原有的库(我这里直接在最后加了个横杠),然后拷贝libaravis-0.8.so.0.8.33,然后将其改为 libaravis-0.8.so
在这里插入图片描述

然后拷贝以下库到arm64-v8a下面,拷贝的时候不能直接拷贝对应名字的,而是要拷贝同样名字前缀但是体积最大的那个,拷贝到arm64-v8a中,再更改名字。不然你拷贝的是软链接,没用。
在这里插入图片描述

在这里插入图片描述
编译然后运行,报这个错误。
在这里插入图片描述
在Ubuntu上用readelf 看看

readelf -d libaravis-0.8.so.0.8.33

在这里插入图片描述

可以使用patchelf直接从文件上去掉

patchelf --replace-needed "/home/yong/Desktop/OpenHarmony/install/lib/libxml2.so" "libxml2.so" libaravis-0.8.so.0.8.33

在这里插入图片描述
把该放过来的文件都搞过来了,但是程序还是崩了,不知道为啥。
在这里插入图片描述
报这个错误

relocating failed: symbol not found. dso=/data/storage/el1/bundle/libs/arm64/libglib-2.0.so.0 s=strtoll_l use_vna_hash=1 van_hash=6969197

在这里插入图片描述


参考
【交叉编译工具 aarch64-linux-gnu-gcc 的介绍与安装】
【meson 创建交叉编译】
【meson交叉编译glib2.76】
【linux交叉编译libiconv】
【cmake 头文件 库文件 路径搜索 CMAKE_INCLUDE_PATH CMAKE_LIBRARY_PATH】
【在幽兰上编译libusb】

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入理解互斥信号量(Mutex)在 FreeRTOS 中的使用与实现

在多任务操作系统中,任务间的同步和资源共享是至关重要的。为了避免多个任务同时访问共享资源,导致资源冲突和数据不一致,信号量(Semaphore) 是常用的同步机制。特别是在 FreeRTOS 中,互斥信号量&#xff0…

Liunx操作系统笔记2

Linux下的包/源管理命令:主要任务是完成在Linux环境下安装软件。 1.rpm 是最基础的rpm包的安装命令,需要提前下载相关安装包和依赖包。 2.yum/dnf是基于rpm包的自动安装命令,可以自动在仓库中匹配安装软件和依赖包。 3.光盘源 是指的 安装系统…

企业级RAG系统架构设计与实现指南(Java技术栈)

企业级RAG系统架构设计与实现指南(Java技术栈) 开篇:RAG系统的基本概念与企业应用价值 在当今快速发展的AI技术背景下,检索增强生成(Retrieval-Augmented Generation, RAG) 已成为构建智能问答、知识库管…

【Rust http编程】Rust搭建webserver的底层原理与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

4 Geotools坐标参考系与转换

在地理信息系统 (GIS) 开发中,坐标参考系统 (Coordinate Reference System, CRS) 是核心概念之一。无论是处理地图投影、坐标转换,还是在 Spring Boot 应用中管理空间数据,理解和正确使用 CRS 都至关重要。本文将围绕 GeoTools 库&#xff0c…

docker start mysql失败,解决方案

文章目录 1.查看端口占用情况2.关闭7767进程3.再次检查4.运行docker start mysql 1.查看端口占用情况 sudo netstat -tanlp | grep :33062.关闭7767进程 sudo kill -9 77673.再次检查 进程已关闭 4.运行docker start mysql 正确启动 备注:可能要关闭防火墙

SQL关键字三分钟入门:DELETE —— 删除数据

在数据库操作中,除了添加和修改记录外,我们有时还需要删除不需要的记录。例如: 清除不再使用的用户账号;删除已完成并归档的订单;移除测试时插入的数据。 这时候就需要用到 SQL 中非常基础但极其重要的关键字 —— D…

electron 全量更新

electron-builder.yml配置更新地址 # 配置自动更新的信息 publish:provider: generic # 更新服务提供者url: http://xxx.xxxx.com/pc/xxx-xx# 更新的地址服务器地址 会自动读取latest.yml 下的版本号比较 检测更新方法autoUpdater.js// src/main/autoUpdater.jsimport { app, d…

《大模型 Agent 应用实战指南》第2章:商业目标与 Agent 能力边界定义

在任何技术项目,特别是像大模型 Agent 这样具有创新性和复杂性的项目启动之初,明确清晰的商业目标是成功的基石。这不仅仅是技术团队的职责,更需要产品、运营、销售甚至高层管理者的深度参与。一个明确的目标能确保所有团队成员步调一致,资源有效分配,并最终衡量项目的成功…

提供稳定可靠的自助共享空间系统,支撑客户无人自助门店运营不错数据,历程感想

以技术产品研发系统为主,为客户提供自助共享空间系统解决方案,适用于共享棋牌室,共享麻将室,共享台球室,共享KTV,共享舞蹈室等场景,以下是其中一位客户真实门店运营数据,第一家店本月…

Golang单例实现

Go语言中,实现单例模式的方式有很多种。单例模式确保一个类只有一个实例,并提供一个全局访问点。Go语言没有类的概念,但是可以通过结构体、函数和包级变量来实现类似的功能。 懒汉实现 type Product interface {DoSomething() }type single…

JVM元空间(Metaspace)详解及其工作流程

JVM元空间(Metaspace)详解与工作流程分析 元空间概述 元空间(Metaspace)是Java虚拟机(JVM)在HotSpot VM 1.8及以后版本中引入的,用于替代永久代(PermGen)的内存区域。它主要存储类的元数据信息,包括: 类的结构信息(如方法、字段…

【JAVA】idea中打成jar包后报错错误: 找不到或无法加载主类

排查步骤 首先要排查的是,将jar文件打开,查看里面的内容是否完整是否有META-INF/MANIFEST.MF是否有MANIFEST.MF里面类路径的目录排查路径里面是否有class文件,如主类 com.example.Main 对应的 class 文件应位于 com/example/Main.class 常见…

Fisco Bcos学习 - 开发第一个区块链应用

文章目录 一、前言二、业务场景分析:简易资产管理系统三、智能合约设计与实现3.1 存储结构设计3.2 接口设计3.3 完整合约代码 四、合约编译与Java接口生成五、SDK配置与项目搭建5.1 获取Java工程项目5.2 项目目录结构5.3 引入Web3SDK5.4 证书与配置文件 六、业务开发…

软件设计模式选择、判断解析-1

前言 解析是我个人的理解,相对来说我觉得是能对上定义的逻辑的 目录 一.单选题 1.设计模式的两大主题是(  )  解析:无 2.下列模式中,属于行为型模式的是() 解析: 排除A和D,剩下的观察者的“观察”…

【编程基本功】Win11中Git安装配置全攻略,包含Git以及图形化工具TortoiseGit

1 摘要 今天田辛老师给大家带来了一份超实用的博客,手把手教你安装并配置 Git 及其图形化界面 TortoiseGit,从官网下载到最终完成配置,每一个步骤都给大家讲得明明白白,还配有相应的截图,即使是新手小白也能轻松上手&…

细谈QT信号与槽机制

转自个人博客 信号与槽是我个人认为QT中最牛的机制之一,最近没有其他的内容可写,今天就来细细总结一下这个信号与槽机制。 1. 信号与槽机制概述 信号与槽机制可以理解为QT中的一种通信手段,在运行相关代码前,分别声明信号和槽&a…

Docker Swarm 与 Kubernetes 在集群管理上的主要区别

Docker Swarm 和 Kubernetes 是两种流行的容器编排工具,它们都可以用于部署、管理和扩展容器化应用,但在集群管理方面有明显的差异。 下面从多个维度对比它们在集群管理上的主要区别: ✅ 一、总体定位 项目Docker SwarmKubernetes官方支持D…

【StarRocks系列】查询优化

步骤参考官网 分析查询 | StarRocks StarRocks-Profile分析及优化指南 StarRocks-Profile分析及优化指南 - 经验教程 - StarRocks中文社区论坛

软测八股--测试理论 1 测试基础

软件测试? 发现程序中的侧屋执行程序工程 目的:不仅是找出错误,还要分析错误产生原因和错误分布。检查开发如阿健过程出现的bug,使开发人员及时修改。测试只能说明软件中存在错误 目标:尽可能发现多的错误。一个好的…