OpenHarmony应用集成和固件集成中C库差异化分析

背景

OpenHarmony中,三方库的使用有两种方式:

一、固件集成

三方库经由OpenHarmony构建框架编译出的动态库或静态库,打包到rom中

二、应用集成

三方库经由IDE(通过IDE中的cmake)编译出的动态库或静态库,打包到hap包中

有时候我们想直接使用三方库,省略编译构建这个过程,直接将固件集成方式构建出来的二进制动态库在IDE上面使用。在使用过程中我们会发现,有时候编译工程,在工程链接三方库的阶段出现找不到符号导致编译失败的问题。

问题分析

问题现象

使用固件集成方式构建出来的动态库,直接在IDE上编译链接时,出现如下图现象

如图所示,提示ld.lld: error: undefined symbol: print(std::__n1::basic_string<char, std::__n1::char_traits>, std::__n1::allocator >)

分析动态库

由上面现象中提示链接时没有找到对应函数符号,我们分析一下动态库的符号表,查看是否存在该符号

通过查看动态库的符号表,我们可以发现存在该函数符号,但是参数中的变量命名空间有所区别,IDE中是std::__n1,而固件集成方式编译出来的动态库是std::__h,从这里看出可能是基础库libc++.so或libc.so有所差异

分析基础库差异

我们对比一下IDE的SDK和OpenHarmony的sdk中的基础库(libc++.so/libc.so)

首先对比libc++.so的符号表(左:IDE中的libc++,右:OpenHarmony中的libc++)

从上图可以看出函数的命名空间被隔离开了,并且部分函数不一致,是新增的

对比libc.so的符号表(左:IDE中的libc,右:OpenHarmony中的libc)

从上图可以看出部分函数有新增

总结

通过以上分析出来的现象,和工具链相关的负责人沟通,命名空间隔离是由工具链这边自己进行隔离的,因为系统侧和ndk侧两边发布版本的节奏不一致,版本不同,如果强行统一会导致api不兼容,数据结构差异等问题。所以固件集成方式构建的库和应用集成构建的库不可以混用。

为了能让大家更好的学习鸿蒙(HarmonyOS NEXT)开发技术,这边特意整理了《鸿蒙开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05

《鸿蒙开发学习手册》:

如何快速入门:https://qr21.cn/FV7h05

  1. 基本概念
  2. 构建第一个ArkTS应用
  3. ......

开发基础知识:https://qr21.cn/FV7h05

  1. 应用基础知识
  2. 配置文件
  3. 应用数据管理
  4. 应用安全管理
  5. 应用隐私保护
  6. 三方应用调用管控机制
  7. 资源分类与访问
  8. 学习ArkTS语言
  9. ......

基于ArkTS 开发:https://qr21.cn/FV7h05

  1. Ability开发
  2. UI开发
  3. 公共事件与通知
  4. 窗口管理
  5. 媒体
  6. 安全
  7. 网络与链接
  8. 电话服务
  9. 数据管理
  10. 后台任务(Background Task)管理
  11. 设备管理
  12. 设备使用信息统计
  13. DFX
  14. 国际化开发
  15. 折叠屏系列
  16. ......

鸿蒙开发面试真题(含参考答案):https://qr18.cn/F781PH

鸿蒙开发面试大盘集篇(共计319页):https://qr18.cn/F781PH

1.项目开发必备面试题

2.性能优化方向

3.架构方向

4.鸿蒙开发系统底层方向

5.鸿蒙音视频开发方向

6.鸿蒙车载开发方向

7.鸿蒙南向开发方向

相关推荐
牛大了20231 小时前
场景题:数据迁移解决方案
开发语言
最爱老式锅包肉9 小时前
《HarmonyOS技术精讲-Core Speech Kit(基础语音服务)》第2篇:语音识别核心功能——流式与非流式实现
语音识别·xcode·harmonyos
认真的酒窝9 小时前
自己动手开发编译器(十一)语义分析
java·开发语言
wbs_scy10 小时前
Linux C++ 高并发编程:线程池全链路深度解析,从原理到手撕实现
java·开发语言
JAVA面经实录91710 小时前
Linux 常用命令完整知识体系
java·linux·开发语言·汇编
贪玩的蛋挞11 小时前
C#与闭包
开发语言·c#
端庄的战斗机11 小时前
javascript 设计模式(文章很长,请自备瓜子,水果和眼药水)
开发语言·javascript·设计模式
在书中成长12 小时前
HarmonyOS 小游戏《对战五子棋》开发第5篇-五子棋GameConstants常量与类型定义最佳实践
华为·harmonyos
Full Stack Developme12 小时前
Java LRU 与 LFU 算法及应用
java·开发语言·算法
最爱老式锅包肉12 小时前
《HarmonyOS技术精讲-ArkWeb》桥接两岸:JSBridge原生与Web互调
前端·华为·harmonyos