本文以 OpenHarmony-3.2-Beta4 上适配 modbus 编译动态库为例。
获取三方库
使用之前要做好代码溯源,确认可用的版本,开源许可和发布方式等。
通过正确的路径获取源码,可以是官网,或者指定托管的 github 或者 gitee 仓。
官网:https://libmodbus.org/ github:https://github.com/stephane/libmodbus
移植三方库
三方库移植主要需要以下四步。
①linux 编译
编译三方库:
如果原三方库根目录存在 CMakeLists.txt 文件,新建 build 目录,通过 cmake 生成 makeflie 然后 make。
如果根目录存在 autogen.sh 或 configure.ac 文件,使用 Makefile.am 构建,先执行 ./autogen.sh,再执行 ./configure 命令生成 Makefile,最后 make 和 make install。
分析编译过程:提取编译动态链接库和测试用的可执行文件所需要的源文件和头文件、编译添加的 cflag 和其他编译器参数,以及编译需要的链接库。
根据三方库的编译有两种情况:
在 cmake 生成 makefile 的过程中,分析 build.make(生成目标的源文件)、depend.make(需要依赖的其他 C 源文件)、flags.make(cflags 相关标记)、link.txt(链接库相关信息)等得出三方库对应的依赖关系。
使用 Makefile.am 构建的三方库,分析 make.am 内容,分析编译动态链接库和测试用的可执行文件需要的源文件,添加的编译器参数。链接库则通过分析 makefile 文件提取。
②OpenHarmony 适配
三方库一般放置在 third_party 目录下。
编译之前要增加模块配置,可以参考以下链接:
https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/subsystems/subsys-build-module.md#新增并编译模块
部件名:modbus_part_name = “libmodbus”
子系统名:modbus_subsystem_name = “modbus”
新增子系统和部件名的方式:
(1)在模块目录下配置 BUILD.gn,根据模板类型选择对应的 gn 模板。
third_party/libmodbus/BUILD.gn(2)在新建的子系统目录下每个部件对应的文件夹下创建 bundle.json 文件,定义部件信息。
third_party/libmodbus/bundle.json(3)修改 build 目录下的 subsystem_config.json 文件。
buildsubsystem_config.json(4)在 vendor/{product_company}/{product-name} 目录下的产品配置如 product-name 是 hispark_taurus_standard 时,在 config.json 中添加对应的部件,直接添加到原有部件后即可。
productdefinecommoninheritrich.json
这几步适配都需要根据三方库的引用方式来确定,并不需要每步都配置。如果当前模块是需要添加到已经有的部件或子系统,就只需要配置 1 和 2 步即可。
③增量编译
编译动态链接库和可执行文件:
./build.sh --product-name rk3568 --ccache --build-target
注:三方库名称 --target-cpu arm64,ohos 到 3.2 版本之后,默认编译的都是 32 位系统,若要支持 64 位系统,在编译命令中添加:
–target-cpu arm64
例如:
./build.sh --product-name rk3568 --ccache -T libmodbus编译过程可能出现报错,根据报错信息调整 gn。消除编译警告,例如:
-Wimplicit-function-declaration改为:
-Wno-implicit-function-declaration
加到 gn 的 cflags 信息里面。
编译成功生成的动态链接库和测试用的可执行文件在 out 目录下。例如:
out/ rk3568/modbus/libmodbus/libmodbus.z.so
④验证接口
将编译好的动态库和测试用例的可执行文件推送到开发板上。然后验证是否成功,保证测试用例都能在开发板上运行通过。
API 接口是提供给北向调用的,实现指定的功能,使用者不需要了解其内部具体实现。按照业务需要提供 native 和 js 接口。
引用方式
①静态库
在部件中需要使用的 gn 中配置 deps 项,然后在代码中直接引用接口。
“//third_party/libmodbus:modbus”,例如:
②动态库
先编译动态库,然后放在板子指定路径,然后通过 dlopen 导入动态库,最后在代码中通过句柄调引用接口。
例如:
if(handle == nullptr){ MMI_HILOGE("Open failed, so name:%{public}s, msg:%{public}s", pluginPath.data(), dlerror()); return false; }
全部0条评论
快来发表一下你的评论吧 !