本文以 OpenHarmony-3.2-Beta4 上適配 modbus 編譯動(dòng)態(tài)庫(kù)為例。
獲取三方庫(kù)
使用之前要做好代碼溯源,確認(rèn)可用的版本,開(kāi)源許可和發(fā)布方式等。
通過(guò)正確的路徑獲取源碼,可以是官網(wǎng),或者指定托管的 github 或者 gitee 倉(cāng)。
官網(wǎng):https://libmodbus.org/ github:https://github.com/stephane/libmodbus
移植三方庫(kù)
三方庫(kù)移植主要需要以下四步。
①linux 編譯
編譯三方庫(kù):
如果原三方庫(kù)根目錄存在 CMakeLists.txt 文件,新建 build 目錄,通過(guò) cmake 生成 makeflie 然后 make。
如果根目錄存在 autogen.sh 或 configure.ac 文件,使用 Makefile.am 構(gòu)建,先執(zhí)行 ./autogen.sh,再執(zhí)行 ./configure 命令生成 Makefile,最后 make 和 make install。
分析編譯過(guò)程:提取編譯動(dòng)態(tài)鏈接庫(kù)和測(cè)試用的可執(zhí)行文件所需要的源文件和頭文件、編譯添加的 cflag 和其他編譯器參數(shù),以及編譯需要的鏈接庫(kù)。
根據(jù)三方庫(kù)的編譯有兩種情況:
在 cmake 生成 makefile 的過(guò)程中,分析 build.make(生成目標(biāo)的源文件)、depend.make(需要依賴的其他 C 源文件)、flags.make(cflags 相關(guān)標(biāo)記)、link.txt(鏈接庫(kù)相關(guān)信息)等得出三方庫(kù)對(duì)應(yīng)的依賴關(guān)系。
使用 Makefile.am 構(gòu)建的三方庫(kù),分析 make.am 內(nèi)容,分析編譯動(dòng)態(tài)鏈接庫(kù)和測(cè)試用的可執(zhí)行文件需要的源文件,添加的編譯器參數(shù)。鏈接庫(kù)則通過(guò)分析 makefile 文件提取。
②OpenHarmony 適配
三方庫(kù)一般放置在 third_party 目錄下。
編譯之前要增加模塊配置,可以參考以下鏈接:
https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/subsystems/subsys-build-module.md#新增并編譯模塊
部件名:modbus_part_name = “l(fā)ibmodbus”
子系統(tǒng)名:modbus_subsystem_name = “modbus”
新增子系統(tǒng)和部件名的方式:
(1)在模塊目錄下配置 BUILD.gn,根據(jù)模板類(lèi)型選擇對(duì)應(yīng)的 gn 模板。
third_party/libmodbus/BUILD.gn(2)在新建的子系統(tǒng)目錄下每個(gè)部件對(duì)應(yīng)的文件夾下創(chuàng)建 bundle.json 文件,定義部件信息。
third_party/libmodbus/bundle.json(3)修改 build 目錄下的 subsystem_config.json 文件。
buildsubsystem_config.json(4)在 vendor/{product_company}/{product-name} 目錄下的產(chǎn)品配置如 product-name 是 hispark_taurus_standard 時(shí),在 config.json 中添加對(duì)應(yīng)的部件,直接添加到原有部件后即可。
productdefinecommoninheritrich.json
這幾步適配都需要根據(jù)三方庫(kù)的引用方式來(lái)確定,并不需要每步都配置。如果當(dāng)前模塊是需要添加到已經(jīng)有的部件或子系統(tǒng),就只需要配置 1 和 2 步即可。
③增量編譯
編譯動(dòng)態(tài)鏈接庫(kù)和可執(zhí)行文件:
./build.sh--product-namerk3568--ccache--build-target
注:三方庫(kù)名稱 --target-cpu arm64,ohos 到 3.2 版本之后,默認(rèn)編譯的都是 32 位系統(tǒng),若要支持 64 位系統(tǒng),在編譯命令中添加:
–target-cpuarm64
例如:
./build.sh--product-namerk3568--ccache-Tlibmodbus編譯過(guò)程可能出現(xiàn)報(bào)錯(cuò),根據(jù)報(bào)錯(cuò)信息調(diào)整 gn。消除編譯警告,例如:
-Wimplicit-function-declaration改為:
-Wno-implicit-function-declaration
加到 gn的 cflags 信息里面。
編譯成功生成的動(dòng)態(tài)鏈接庫(kù)和測(cè)試用的可執(zhí)行文件在 out 目錄下。例如:
out/rk3568/modbus/libmodbus/libmodbus.z.so
④驗(yàn)證接口
將編譯好的動(dòng)態(tài)庫(kù)和測(cè)試用例的可執(zhí)行文件推送到開(kāi)發(fā)板上。然后驗(yàn)證是否成功,保證測(cè)試用例都能在開(kāi)發(fā)板上運(yùn)行通過(guò)。
API 接口是提供給北向調(diào)用的,實(shí)現(xiàn)指定的功能,使用者不需要了解其內(nèi)部具體實(shí)現(xiàn)。按照業(yè)務(wù)需要提供 native 和 js 接口。
引用方式
①靜態(tài)庫(kù)
在部件中需要使用的 gn 中配置 deps 項(xiàng),然后在代碼中直接引用接口。
“//third_party/libmodbus:modbus”,例如:
②動(dòng)態(tài)庫(kù)
先編譯動(dòng)態(tài)庫(kù),然后放在板子指定路徑,然后通過(guò) dlopen 導(dǎo)入動(dòng)態(tài)庫(kù),最后在代碼中通過(guò)句柄調(diào)引用接口。
例如:
if(handle==nullptr){ MMI_HILOGE("Openfailed,soname:%{public}s,msg:%{public}s",pluginPath.data(),dlerror()); returnfalse; }
-
MODBUS
+關(guān)注
關(guān)注
28文章
1799瀏覽量
76947 -
移植
+關(guān)注
關(guān)注
1文章
379瀏覽量
28124 -
編譯
+關(guān)注
關(guān)注
0文章
657瀏覽量
32852 -
鴻蒙
+關(guān)注
關(guān)注
57文章
2339瀏覽量
42805 -
OpenHarmony
+關(guān)注
關(guān)注
25文章
3713瀏覽量
16253
原文標(biāo)題:鴻蒙三方庫(kù)適配指南
文章出處:【微信號(hào):gh_834c4b3d87fe,微信公眾號(hào):OpenHarmony技術(shù)社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論