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
英文地址,請注明出處:http://en.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,使開發人員及時修改。測試只能說明軟件中存在錯誤 目標:盡可能發現多的錯誤。一個好的…