HarmonyOS編譯開源native庫(OpenSSL實例)

前言

近期項目要開始做鴻蒙版本,有一部分依賴native的代碼也需要遷移,某個native模塊依賴openssl,需要在鴻蒙下重新編譯openssl才行。一開始找了很多相關文檔都沒有得到方法,無奈只能自己憑經驗慢慢試,最后還是成功了。

鴻蒙NDK下載地址

https://gitee.com/openharmony/docs/tree/master/zh-cn/release-notes#openharmony-release-notes

需要單獨下載一份sdk,因為ide里面下載的sdk里面的ndk是不全的,缺少sysroot

如何編譯

使用Cmake

上面的下載地址其實包含了編譯三方庫的教程,但是只有基于Cmake的方式,而且非常簡陋,并沒有提供一個真實的三方庫編譯教程,而實際開發中通常要復雜很多,需要編譯的庫往往有許多配置,還有一些子依賴,比較難以處理。另外有些庫壓根沒有提供Cmake編譯的方式,比如OpenSSL。如果庫支持的話使用cmake編譯相對簡單一些,可以使用cmake-gui或者ide。

使用庫提供的其他編譯方式

大多數庫都會提供一個配置腳本(./Configure)讓使用者自定義進行編譯,通常只需要配置好一些必要參數,必要工具的路徑就可以比較輕松的完成,但是現在主流庫肯定是沒有鴻蒙支持的,所以需要自己額外配置的東西很多,接下來以編譯OpenSSL為例。

先定義一個比較通用的配置腳本build_config.sh,方便以后編譯其他庫也能用,鴻蒙的編譯器好像不像android那樣需要區分api和架構,全都在llvm目錄下,直接指定就可以了

另外還需要指定目標平臺target、sysroot、cflags這些,我在文檔里面沒有找到,按照慣例找到了sdk里面的ohos.toolchain.cmake文件,參考這個文件進行了定義

比較麻煩的是編譯openssl時需要指定的架構,openssl支持的架構配置在下圖這些文件里面給了定義,但是沒有鴻蒙的支持,那就只能選用linux的,linux-armv4、linux-aarch64這些。

image

build_config.sh

 #NDK路徑export OHOS_NATIVE_HOME=/Users/admin/Downloads/ohos-sdk/darwin/nativeexport PATH=$OHOS_NATIVE_HOME/llvm/bin:$PATH#cpu架構if [ "$#" -lt 1 ]; thenTHE_ARCH=armv7elseTHE_ARCH=$(tr [A-Z] [a-z] <<< "$1")fiBASE_FLAGS="--sysroot=$OHOS_NATIVE_HOME/sysroot -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -fno-addrsig -Wa,--noexecstack -fPIC"#根據不同架構配置環境變量case "$THE_ARCH" inarmv7a|armeabi-v7a)OHOS_ARCH="armeabi-v7a"OHOS_TARGET="arm-linux-ohos"OPENSSL_ARCH="linux-armv4"FF_EXTRA_CFLAGS="--target=$OHOS_TARGET $BASE_FLAGS -march=armv7a"FF_CFLAGS="--target=$OHOS_TARGET $BASE_FLAGS -march=armv7a";;armv8|armv8a|aarch64|arm64|arm64-v8a)OHOS_ARCH="arm64"OHOS_TARGET="aarch64-linux-ohos"OPENSSL_ARCH="linux-aarch64"FF_EXTRA_CFLAGS="--target=$OHOS_TARGET $BASE_FLAGS"FF_CFLAGS="--target=$OHOS_TARGET $BASE_FLAGS";;x86_64|x64)OHOS_ARCH="x86_64"OHOS_TARGET="x86_64-linux-ohos"OPENSSL_ARCH="linux-x86_64"FF_EXTRA_CFLAGS="--target=$OHOS_TARGET $BASE_FLAGS"FF_CFLAGS="--target=$OHOS_TARGET $BASE_FLAGS";;*)echo "ERROR: Unknown architecture $1"[ "$0" = "$BASH_SOURCE" ] && exit 1 || return 1;;esac# 工具鏈TOOLCHAIN=$OHOS_NATIVE_HOME/llvm# 交叉編譯庫搜索路徑SYS_ROOT=$OHOS_NATIVE_HOME/sysroot# 編譯器CC=$TOOLCHAIN/bin/clangCXX=$TOOLCHAIN/bin/clang++# 鏈接器,將目標文件(包括靜態庫和共享庫)合并成一個可執行文件或共享庫LD=$TOOLCHAIN/bin/ld-lld# 匯編器,將匯編語言代碼轉換為機器代碼AS=$TOOLCHAIN/bin/llvm-as# 靜態庫管理工具,用于創建、修改和提取靜態庫中的目標文件AR=$TOOLCHAIN/bin/llvm-ar# 符號表工具,用于顯示目標文件中的符號(函數、變量等)信息NM=$TOOLCHAIN/bin/llvm-nm# 靜態庫索引工具,用于創建和更新靜態庫的索引,以提高庫的訪問速度RANLIB=$TOOLCHAIN/bin/llvm-ranlib# 剝離工具,用于從可執行文件或共享庫中去除調試信息,從而減小文件大小STRIP=$TOOLCHAIN/bin/llvm-strip

接下來就比較簡單了,再定義一個執行編譯的腳本build_openssl.sh,可選的編譯參數在configure文件里面,可以按需要配置

image

build_openssl.sh

  #!/bin/bashARCH=$1source build_config.sh $ARCHLIBS_DIR=$(cd `dirname $0`; pwd)/libs/opensslPREFIX=$LIBS_DIR/$OHOS_ARCHecho "PREFIX"=$PREFIXexport CC="$CC"export CXX="$CXX"export CXXFLAGS=$FF_EXTRA_CFLAGSexport CFLAGS=$FF_CFLAGSexport AR="$AR"export LD="$LD"export AS="$AS"export NM="$NM"export RANLIB="$RANLIB"export STRIP="$STRIP"export LDFLAGS="--rtlib=compiler-rt -fuse-ld=lld"./Configure $OPENSSL_ARCH \--prefix=$PREFIX \no-engine \no-asm \no-threads \sharedmake cleanmake -j2make installcd ..

還有兩個比較坑的點

  1. armv7架構下openssl依賴了libatomic,但是鴻蒙sdk里面沒有提供這個庫,所以我直接去改了openssl里面的配置,linux-armv4配置原本繼承自linux-latomic,依賴了libatomic,直接改成繼承linux-generic32,libatomic是一個多線程下保持原子性的庫,所以需要加上no-threads禁用多線程。另外也可以自己去編譯一個libatomic出來一起鏈接,這樣就可以用多線程了

image

  1. 默認配置編譯出來的so庫是帶軟鏈接,有so.x.y這種帶版本號的命名,也需要在配置里面改一下

image

最后把腳本文件放到openssl目錄下執行編譯就可以了,也可以再寫一個腳本方便一次性編譯所有架構

for arch in armeabi-v7a arm64-v8a
dobash build_openssl.sh $arch
done

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/214943.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/214943.shtml
英文地址,請注明出處:http://en.pswp.cn/news/214943.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

JS基礎之執行上下文

JS基礎之執行上下文 執行上下文順序執行可執行代碼執行上下文棧回顧上文 執行上下文 順序執行 寫個JavaScript的開發者都會有個直觀的印象&#xff0c;那就是順序執行&#xff1a; var foo function(){console.log(foo1) } foo(); //foo1 var foo function(){console.log(…

HTML面試題---專題一

文章目錄 一、前言二、 HTML5 中 <header> 和 <footer> 標簽的用途是什么&#xff1f;三、如何在 HTML 中嵌入 SVG&#xff08;可縮放矢量圖形&#xff09;文件&#xff1f;四、解釋 contenteditable 屬性的用途五、如何創建隨屏幕尺寸縮放的響應式圖像&#xff1f…

八大排序算法【上】

冒泡排序 冒泡排序是一種 穩定 的排序算法。 它的工作原理是每次檢查相鄰兩個元素&#xff0c;如果前面的元素與后面的元素滿足給定的排序條件&#xff0c;就將相鄰兩個元素交換。當沒有相鄰的元素需要交換時&#xff0c;排序就完成了。 假設我們想要從小到大進行排序&#…

大模型:常見的文字表情包(可以直接加到微調數據里)

大模型&#xff1a;常見的文字表情包(可以直接加到微調數據里) 返回論文目錄 返回資料目錄 表情符號含義&#x1f60a;愉快、微笑&#x1f602;大笑&#x1f60d;愛心眼&#x1f60e;酷、自信&#x1f914;思考、疑惑&#x1f61c;調皮、頑皮&#x1f64c;鼓掌、慶祝&#x1f…

線上扭蛋機小程序搭建,扭蛋與科技的完美結合

扭蛋機作為當下比較熱門的一種盲盒玩法&#xff0c;在年輕人群體中非常受歡迎。隨著經濟的增長和人們生活水平的提高&#xff0c;人們對娛樂消費需求也在增加&#xff0c;扭蛋機的受眾群體也在擴大。 目前線上扭蛋機小程序也獲得了大眾的青睞&#xff0c;扭蛋機小程序就是把線…

記錄一下快速上手Springboot登錄注冊項目

本教程需要安裝以下工具&#xff0c;如果不清楚怎么安裝的可以看下我的這篇文章 鏈接: https://blog.csdn.net/qq_30627241/article/details/134804675 管理工具&#xff1a; maven IDE&#xff1a; IDEA 數據庫&#xff1a; MySQL 測試工具&#xff1a; Postman 打開IDE…

Ansys結構靜力學仿真的一般流程

1. 模型實體 三維幾何模型的構建。 2. 材料屬性 根據實際情況&#xff0c;為模型中的各個部分定義材料屬性&#xff0c;包括彈性模量、泊松比、密度等。 3. 單元類型 node 結點數等 4. 網格劃分 網格屬性&#xff08;尺寸&#xff09; 5. 邊界條件 這個定義有點模糊&#x…

AR-LDM原理及代碼分析

AR-LDM原理AR-LDM代碼分析pytorch_lightning(pl)的hook流程main.py 具體分析TrainSampleLightningDatasetARLDM blip mm encoder AR-LDM原理 左邊是模仿了自回歸地從1, 2, ..., j-1來構造 j 時刻的 frame 的過程。 在普通Stable Diffusion的基礎上&#xff0c;使用了1, 2, .…

天池SQL訓練營(六)-綜合練習題-10道經典題目

如果你還沒有學習過SQL訓練營的以下知識&#xff0c;請查閱主頁博文學習&#xff1a; Task 1 SQL基礎&#xff1a;初識數據庫與SQL-安裝與基本介紹等 Task 2 SQL基礎&#xff1a;查詢與排序-select、運算符、聚合分組查詢等 Task 3 SQL進階&#xff1a;復雜查詢方法-視圖、子查…

網工內推 | 項目經理專場,最高20K*13薪,軟考證書優先

01 Trasen 招聘崗位&#xff1a;大項目經理&#xff08;醫療行業/HIS&#xff09; 職責描述&#xff1a; 1.負責項目按計劃完成交付并順利驗收結項&#xff1b; 2.參與項目前期預算、評審、方案設計等&#xff1b; 3.負責具體項目實施&#xff0c;制定項目計劃、組織項目資源、…

Web網站服務(二)

1、客戶機地址限制。 Require all granted&#xff1a;表示允許所有主機訪問。 Require all denied&#xff1a;表示拒絕所有主機訪問。 Require local&#xff1a;表示僅允許本地主機訪問。 Require [not] host <主機名或域名列表>&#xff1a;表示允許或拒絕指定主機或…

Web安全-SQL注入【sqli靶場第11-14關】(三)

★★實戰前置聲明★★ 文章中涉及的程序(方法)可能帶有攻擊性&#xff0c;僅供安全研究與學習之用&#xff0c;讀者將其信息做其他用途&#xff0c;由用戶承擔全部法律及連帶責任&#xff0c;文章作者不承擔任何法律及連帶責任。 0、總體思路 先確認是否可以SQL注入&#xff0…

輕空間助力中國高校實現場館多功能一體化

中國高校在迎接體育、文藝、學術等多元化需求的同時&#xff0c;面臨著場館設施不足、建設成本高的難題。然而&#xff0c;隨著輕空間&#xff08;江蘇&#xff09;膜科技有限公司的嶄新解決方案的引入&#xff0c;中國高校如蘇州大學等正迎來一場場館多功能一體化的革命。 創新…

電源小白入門學習4——LDO的選擇與使用技巧

電源小白入門學習4——LDO的選擇與使用技巧 LDO簡介LDO工作原理LDO選型LDO并聯問題LDO的新發展 上期我們介紹了開關電源系統中一些常見的元器件&#xff0c;這期我們來學習LDO的選擇與使用技巧 LDO簡介 LDO的全稱是低壓差線性穩壓器&#xff08;Low Drop-Out Linear Regulator…

python的os模塊(一)

os 模塊提供了非常豐富的方法用來處理文件和目錄。常用的方法如下表所示&#xff1a; 一.os.getcwd 相當于shell的 pwd&#xff0c;查看當前目錄 [rootrhel8 day06]# vim demo01.py import os print(os.getcwd()) #查看當前目錄[rootrhel8 day06]# python3 demo01.py /root/m…

計算機病毒判定專家系統原理與設計《文字提取人工修正》

內容源于網絡。網絡上流轉的版本實在是不易閱讀&#xff0c; 又不忍神作被糟蹋故稍作整理&#xff0c;對于內容仍然有識別不準的地方&#xff0c;網友可留言&#xff0c;我跟進修改。 雷 軍 &#xff08;武漢大學計算機系&#xff0c;430072) 摘要: 本文詳細地描述了…

Rust的未來發展趨勢和行業應用

大家好&#xff01;我是lincyang。 今天&#xff0c;我們來深入探討Rust的未來發展趨勢以及它在各個行業中的應用情況。 自從Rust語言問世以來&#xff0c;它以其獨特的安全性和高效性在編程界引起了廣泛關注。Rust的設計理念主要集中在安全、速度和并發三個方面&#xff0c;…

【數值計算方法(黃明游)】數值積分(一):復化(梯形公式、中點公式)【理論到程序】

? 文章目錄 一、梯形公式、中點公式1. 梯形公式&#xff08;Trapezoidal Rule&#xff09;&#xff1a;2. 復化梯形公式&#xff08;Composite Trapezoidal Rule&#xff09;&#xff1a;3. 中點公式&#xff08;Midpoint Rule&#xff09;&#xff1a;4. 復化中點公式&#…

算法通關村第十五關 | 黃金 | 超大規模數據場景

1.對 20GB 文件進行排序 有一個 20GB 的文件&#xff0c;每行一個字符串&#xff0c;對其進行排序。 這里可以使用分塊方式來排序&#xff0c;先將每塊進行排序&#xff0c;然后要逐步進行合并&#xff0c;也叫做外部排序。 2.超大文本中搜索兩個單詞的最短距離 有一個超大…