鸿蒙开发5.0【基于lycium的开源c库编译与集成】

news2025/5/17 13:30:08

场景描述

对于c库编译问题,应用经常会遇到如下业务诉求

场景一:基于HarmonyOS编译开源C库

场景二:开源c库编译完成后的集成

方案描述

场景一:

需要使用开源c库

lycium的使用说明:lycium的特点就是自动化编译,只需要一个./build.sh命令就可以完成编译,下面的编译例子(openssl)代码库是通过hpkbuild脚本从github或者gitee上面拉取,在hpkbuild脚本中已经默认提供了一套编译默认的配置,也可以按照需求修改。

lycium的范围说明:在[开源c库仓]已经提供了一套默认配置,针对lycium自动化编译脚本的使用。lycium其涵盖了三种构建方式,不在c仓的需要针对该库的编译方式手动编译或者手动写脚本。

方案

使用lycium交叉编译框架将已经移植过来的c库编译,以及针对某些特定库在使用交叉编译过程中会遇到的一些常见问题。

我们从头开始演示如何编译移植过来的openssl库

lycium编译环境准备

1.对应平台下载[ohos sdk]并进行解压

2.配置环境变量 如Mac环境举例

1

3.拷贝编译工具

在使用lycium工具前,需要将这些编译命令拷贝到SDK对应的目录下,具体操作如下:

cd lycium/Buildtools # 进入到工具包目录

sha512sum -c SHA512SUM # 可校验工具包是否正常, 若输出"toolchain.tar.gz: OK"则说明工具包正常,否则说明工具包异常,需重新下载

tar -zxvf toolchain.tar.gz # 解压拷贝编译工具

cp toolchain/* ${OHOS_SDK}/native/llvm/bin # 将命令文件拷贝到工具链的native/llvm/bin目录下

#是将toolchain.tar.gz解压出来的命令文件拷贝到工具链的native/llvm/bin目录下

快速编译开源C库

1.将 [tpc_c_cplusplus]C库仓克隆或者下载zip包下载 以我的Mac目录为例子 cd到仓库lycium 目录

2

2…/build.sh openssl 开始编译 并等待ALL JOBS DONE!!

3

3.编译好的openssl会生成在 lycium/usr 目录下

4

编译中可能遇到的问题

1.遇到网络问题 openssl/HPKBUILD 脚本中指定的三方库源码包下载不下来

ERROR during :download XXX.tar.gz

因为仓库不承载三方库的源码部分,因此进行三方库编译时需要先从开源社区获取源码部分,此部分可能需要网络代理等方式保证对gitee、github等网站的连通,当出现此错误时代表wget等下载工具不能够正常获取代码,请检查网络配置。

解决办法

5

将source 链接中对应部分进行替换后复制进浏览器下载 并将生成的包放在tpc_c_cplusplus-master\thirdparty\openssl后 再重复编译操作

2.对需要的架构进行选择编译(一些伙伴使用模拟器需要使用到x86架构)

场景一:对于有些伙伴由于真机缺少真机,需要在模拟器上面使用x86架构的动态库,以网络库curl为例

由于curl由cmake构建所以只需要在编译脚本HPKBUILD文件中的archs=(“armeabi-v7a” “arm64-v8a”)添加"x86_64"

参考文档: lycium上面适配HarmonyOS不同架构的构建

3.“请先安装 xxx命令,才可以编译”

此信息代表当前编译三方库强需求xxx工具或者命令,请先安装对应的工具以及确保安装后的环境变量能够在tpc_c_cplusplus仓库目录生效。

场景二:

编译好的文件不知道如何进行集成,自行链接出现运行闪退

闪退原因:对于通用加载崩溃,都是没有打包到hap里面去导致的,或者是打包进去了,依赖库没打包进去,基本都是这种情况

方案

以openssl为例子

应用中集成三方库

在DevEco Studio的cpp目录(在引用三方库的模块的cpp目录下)下新增thirdparty目录,将编译生成的库拷贝到该目录下,如下图所示:

6

在最外层(cpp目录下)CMakeLists.txt中添加如下语句

#将三方库加入工程中

target_link_libraries(entry PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/openssl/${OHOS_ARCH}/lib/libssl.a)

target_link_libraries(entry PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/openssl/${OHOS_ARCH}/lib/libcrypto.a)



#将三方库的头文件加入工程中

target_include_directories(entry PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/openssl/${OHOS_ARCH}/include)

C++中的库分为静态库和动态库两种。静态库在链接时被完整地复制到可执行文件中,而动态库则是在运行时加载到内存中。它们有以下几个区别:

  1. 静态库将库代码静态地编译到可执行文件中,因此可执行文件的大小会增大;而动态库则是在运行时从共享库中加载所需的代码,因此可执行文件的大小较小。
  2. 静态库一旦被链接,其中所有的代码都不再发生更改;而动态库可以在程序运行时被升级或替换。
  3. 多个可执行文件可以使用同一个动态库,以减少内存占用和磁盘空间的使用。但每个可执行文件都需要包含其自己的静态库副本,因此可能会浪费大量的磁盘空间。

如果是使用静态库,参考对应库文档

下面说明如何连接动态库

库名/架构名/lib目录下是编译时需要的动态库,cmakelist链接动态库时是指这个路径

libs/架构名 下的带主版本号的会打进hap包中,是运行时需要的动态库

应用在引用动态库的时候是通过soname来查找的,所以我们需要将名字为soname的库文件拷贝到entry/libs/${OHOS_ARCH}/目录下

soname查看方法:$OHOS_SDK/native/llvm/bin/llvm-readelf -d libxxx.so

大多数情况下soname就是带主版本号的动态库

所以详细步骤如下

libs/arm64-v8a下放入所有的.so.版本号 文件

thirdparty\xxx(一般为库名)\arm64-v8a(架构名)\lib下放入所有的.so文件 如图

7

以上就是本篇文章所带来的鸿蒙开发中一小部分技术讲解;想要学习完整的鸿蒙全栈技术。可以在结尾找我可全部拿到!
下面是鸿蒙的完整学习路线,展示如下:
1

除此之外,根据这个学习鸿蒙全栈学习路线,也附带一整套完整的学习【文档+视频】,内容包含如下

内容包含了:(ArkTS、ArkUI、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、鸿蒙南向开发、鸿蒙项目实战)等技术知识点。帮助大家在学习鸿蒙路上快速成长!

鸿蒙【北向应用开发+南向系统层开发】文档

鸿蒙【基础+实战项目】视频

鸿蒙面经

2

为了避免大家在学习过程中产生更多的时间成本,对比我把以上内容全部放在了↓↓↓想要的可以自拿喔!谢谢大家观看!
3

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2082426.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

8.28-回顾+容器与主机之间的通信+跨主机容器之间的通信

一、回顾 1.启动docker systemctl start docker 2.拉取registry docker pull registry 3.启动镜像,同时挂载目录(保存镜像)端口映射5000 docker run -d -v /regist/:/var/lib/registry/ -p5000:5000 registry:latest 4.修改/etc/docker/d…

培训第三十八天(上传镜像,私有仓库下载镜像,跨主机容器间的通信,harbor软件包下载)

1、harbor软件包下载 https://github.com/search?qharbor&typerepositories 2、出现拒绝连接错误,可能是由于容器没开 # 问题解决:[rootdocker ~]# curl localhost:5000/v2/_catalogcurl: (7) Failed connect to localhost:5000; 拒绝连接[rootdoc…

pdf怎么转换成excel?掌握好这9个pdf转换方法就够了(全)

pdf怎么转换成excel?日常的办公生活中,我们经常需要接触很多文档格式,而pdf格式文件因为其稳定性和安全性受到很多办公人士的喜爱。但PDF文件不能直接编辑,很多小伙伴们就会出现关于pdf格式转换的难题,比如说想把一份带…

MATLAB虫害检测预警系统

一、课题介绍 本课题是基于MATLAB颜色的植物虫害检测识别,可以辨析植物叶子属于是轻度虫害,中度虫害,严重虫害,正常等四个级别。算法流程:每种等级叶子分别放在同一个文件夹,训练得到每个文件夹每个叶…

SSL安全认证网关:保障网络安全的强大护盾

随着信息技术的飞速发展,我们的生活和工作越来越依赖于网络,但与此同时,网络安全威胁也日益严峻。为了保护我们的信息安全,各种安全技术和产品应运而生,其中SSL安全认证网关就是一种非常重要的安全防护工具。 今天&…

3款伪原创工具,为你轻松一键生成原创文案

在当今信息爆炸的时代,原创内容的重要性愈发凸显。然而,对于许多创作者来说,创作原创文案却是一项费时费力的挑战。幸运的是,随着科技的进步,现在有三款伪原创工具能够帮助你轻松一键生成原创文案,为你节省…

DNS服务器的配置(服务名named,端口53)

目录 前言 配置文件 DNS服务器的配置 主配置文件 扩展配置文件 区域配置文件 重启服务 配置防火墙 配置客户端dns 前言 DNS服务器的主要作用是将人类可读的域名转换为机器可读的IP地址,从而方便用户访问互联网资源。 在互联网中,设备需要通过I…

基于资源管控+TiCDC实现多业务融合容灾测试

作者: 数据源的TiDB学习之路 原文来源: https://tidb.net/blog/959b8d07 背景 金融机构越来越多的选择将多套业务系统融合到一套分布式数据库集群来支撑,一方面可以节约硬件成本,另一方面可以简化运维复杂性。多租户能力及资源…

【电控笔记z26】串级PID单环位置PID

1P-PI 传函(梅森法) : 2PI-P 3PID 三者等效

HyperMesh概述与有限元分析简介

1.1 HyperMesh 概述 本节将介绍有限单元法基本原理,HyperMesh 软件基本功能及界面介绍,获取在线帮助等内容。 1.1.1 有限元分析方法简介 有限单元法(FEM)是一种可以精确预测复杂结构在外界载荷作用下响应的方法,该数…

问界都回暖了,是谁还在持续掉队?

文/王俣祺 导语:在8月份的最后一个完整周,国内汽车市场的销量表现全面提升,乘用车市场销量达到了46.6万辆车,环比增长13.1%。其中,新能源汽车销量达到24.2万辆,环比增长11.6%,市场渗透率达到了…

《探索现代JavaScript中的异步编程》

探索现代JavaScript中的异步编程 随着Web应用变得越来越复杂,前端开发中对异步处理的需求也日益增加。JavaScript 作为 Web 开发中最主要的语言之一,提供了多种异步编程的方法来帮助开发者编写高效、可维护的应用程序。本文将介绍几种现代 JavaScript 中…

P5928 [国家集训队] 文学 题解

Description 给定 n n n 个半平面 a i x b i y ≤ c i a_i xb_i y\le c_i ai​xbi​y≤ci​ 和 p p p 个关键点 ( x i , y i ) (x_i,y_i) (xi​,yi​),第 i i i 个半平面有价格 w i w_i wi​,你需要选择一些半平面覆盖所有的关键点,同…

深入探索Elasticsearch:从零基础到实战精通的全方位指南

ElasticSearch 一、初识ElasticSearch1、ES的介绍2、索引3、正排索引3、倒排索引 一、安装1、下载2、检查是否启动 二、语法1、添加一个文档编辑2、批量插入3、搜索4、查询某个特定的字段5、根据id查询6、修改7、删除8、mapping 三、分词器 一、初识ElasticSearch 1、ES的介绍…

大型公司网络系统集成方案

一、前言 1.1.公司综合信息系统建设目标 -----------------------------------------------------3 1.2. 用户具体需求----------------------------------------------------------------------------4 1.3.公司综合信息系统建设原则 -------------------------------…

vue3+ts+mock实现增删改查json文件

1.代码结构图: 2.路由 import { createRouter, createWebHashHistory } from "vue-router";import Home from "/pages/home/index.vue"; import AppDetail from "/pages/app-detail/index.vue"; import PageDetail from "/pages…

hadoop生态圈(四)- MapReduce

目录 MapReduce的基本原理 MapReduce流程图 Map阶段执行流程 Reduce阶段执行流程 Shuffle机制 MapReduce解决的是海量数据计算 MapReduce的思想核心是“分而治之”。就是把一个复杂的问题按一定的“分解”方法分为规模较小的若干部分,然后逐个解决,…

作业0828

使用C手动封装一个顺序表&#xff0c;包含成员数组一个&#xff0c;成员变量N个 #include <iostream> #include <string>using namespace std;using datatype int;struct Seqlist { private:datatype *data NULL;int size 0;int len 0;public://初始化函数voi…

从零成本到高效能:免费报表工具在金融行业的实践与应用

在当今金融行业中&#xff0c;多样化的报表体系是支撑机构高效运营、精准决策的重要基石。这些报表不仅反映了金融机构的财务状况&#xff0c;还涵盖了风险管理、业绩评估、流动性管理及合规监管等多个维度。今天我将带领大家深入探讨金融行业中这些报表的多样性和重要性&#…

数据的存储3(第三十二天)

1.整形在内存中的存储&#xff08;补充&#xff09; 原码&#xff0c;反码&#xff0c;补码的概念 &#xff08;1&#xff09;正数的原码&#xff0c;反码&#xff0c;补码相同 &#xff08;2&#xff09;对于整数来说&#xff1a;数据存放内存中其实存放的就是补码 2.浮点…