当前位置: 首页 > 科技观察

OpenHarmony—三方库适配指南

时间:2023-03-13 13:39:43 科技观察

了解更多开源请访问:开源基础软件社区https://ost.51cto.com先获取三方库再使用需要追溯代码来源,确认可用版本、开源许可和发布方式等。通过正确的路径获取源代码,可以是官网,也可以是指定托管的github或gitee仓库。官网:https://libmodbus.org/github:https://github.com/stephane/libmodbus第三方库的迁移第三方库的迁移主要需要以下四个步骤。Linux编译编译三方库:1、如果原三方库的根目录下有CMakeLists.txt文件,新建一个build目录,通过cmake生成makeflie,然后make。2、如果根目录下有autogen.sh或configure.ac文件,使用Makefile.am构建,先执行./autogen.sh,再执行./configure命令生成Makefile,最后make和makeinstall.分析编译过程:提取编译所需的源文件和头文件动态链接库和测试用的可执行文件,编译时添加的cflag等编译参数,编译所需的链接库。根据三方库的编译,有两种情况:1.在cmake生成makefile的过程中,分析build.make(生成target的源文件),depend.make(其他需要的C源文件)依赖)、flags.make(cflags相关标签)、link.txt(链接库相关信息)等,得到对应的三方库依赖。2、使用Makefile.am构建的第三方库,分析make.am的内容,分析编译动态链接库所需的源文件和测试用的可执行文件,以及添加的编译参数。通过分析makefile提取链接库。OpenHarmony适配三方库一般放在third_party目录下。编译前添加模块配置,可参考以下链接:https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/subsystems/subsys-build-module.md#Add并编译Modulepartname:modbus_part_name="libmodbus"Subsystemname:modbus_subsystem_name="modbus"添加子系统和partnames的方法:1.在module目录下配置BUILD.gn,根据对应的gn模板third_party/libmodbus模板类型/BUILD.gn2。在新建的子系统目录下每个组件对应的文件夹中创建一个bundle.json文件,定义组件信息。第三方/libmodbus/bundle.json3。修改build目录下的subsystem_config.json文件。build\subsystem_config.json4,vendor/{product_company}/{product-name}目录下的产品配置,比如product-name是hispark_taurus_standard,在config.json中添加相应的组件,直接在原有组件中添加即可。productdefine\common\inherit\rich.json的步骤需要根据三方库的引用方法来确定,不需要每一步都配置。如果当前模块需要添加到已有的组件或子系统中,只需要配置步骤1和步骤2。增量编译和编译动态链接库和可执行文件:./build.sh--product-namerk3568--ccache--build-target三方库名--target-cpuarm64注:ohos到3.2版本后,默认编译的都是32位系统。支持64位系统,在编译命令中加入–target-cpuarm64,例如:./build.sh--product-namerk3568--ccache-Tlibmodbus编译时可能会报错,根据adjustgnfor错误信息。消除编译警告,例如:-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("打开失败,soname:%{public}s,msg:%{public}s",pluginPath.data(),dlerror());返回假;}了解更多开源知识,请访问:开源基础软件社区https://ost.51cto.com