如何在MacOS上使用OpenHarmony SDK交叉编译?

本文以cJSON三方库为例介绍如何通过OpenHarmony的SDK在Mac平台进行交叉编译。

环境准备

SDK准备

我们可以通过 openHarmony SDK 官方发布渠道下载对应mac版本的SDK,当前OpenHarmony MAC版本的SDK有2种,一种是x86架构,另一种是arm64,我们需要根据自身设备的架构信息选择对应的版本,本示例中使用的MAC设备是m系列芯片,其架构是arm64的,因此我们选择arm64架构的SDK。

cd ~                        # 进入到用户目录
curl -L http://download.ci.openharmony.cn/version/Master_Version/OpenHarmony_4.0.10.5/20230824113825/20230824113825-L2-SDK-MAC-M1-FULL.tar.gz --output ohos-sdk.tar.gz # 通过curl命令下载工具链

下载完SDK后对其进行解压

tar -zxvf ohos-sdk.tar.gz                           # 解压ohos sdk
cd sdk/packages/ohos-sdk/darwin/                    # 进入到darwin目录
unzip native-darwin-arm64-4.0.10.5-Release.zip      # 因为 c/c++ 库的编译只涉及到 native 工具,因此我们只需要解压native工具即可。

cmake工具准备

cJSON是通过cmake构建方式进行编译的,所以在编译前我们需要确保编译机上cmake能正常使用。

原则上我们需要使用SDK提供的cmake进行编译,但当前SDK中的cmake是X86架构,在arm架构的编译机上无法使用,因此我们需要在编译机上安装系统的cmake命令:

brew install cmake          # 通过brew包管理工具安装cmake工具

由于cmake官方是不支持OHOS的,在编译过程中因为无法识别OHOS而导致编译错误,因此我们需要在系统cmake中添加OHOS的配置,方法如下:

cp sdk/packages/ohos-sdk/darwin/native/build-tools/cmake/share/cmake-3.16/Modules/Platform/OHOS.cmake /opt/homebrew/Cellar/cmake/3.28.0/share/cmake/Modules/Platform/

cJSON源码准备

适配三方库如果没有指定版本,我们一般取三方库最新版本,不建议使用master的代码,这里我们下载cJSON v1.7.15 版本的源码:

cd ~/Workspace
git clone https://github.com/DaveGamble/cJSON.git -b v1.7.15       # 通过git下载指定版本的源码

编译&安装

  1. 新建编译目录

    为了不污染源码目录文件,我们推荐在三方库源码目录新建一个编译目录,用于生成需要编译的配置文件,本用例中我们在cJSON目录下新建一个build目录:

   cd sJSON                             # 进入cJSON目录mkdir build && cd build              # 创建编译目录并进入到编译目录
  1. 配置交叉编译参数,生成Makefile
   cmake -DCMAKE_TOOLCHAIN_FILE=/Users/ohos/sdk/packages/ohos-sdk/darwin/native/build/cmake/ohos.toolchain.cmake -DCMAKE_INSTALL_PREFIX=/Users/ohos/Workspace/usr/cJSON -DOHOS_ARCH=arm64-v8a .. -L             # 执行cmake命令

参数说明:

  1. CMAKE_TOOLCHAIN_FILE: 交叉编译置文件路径,必须设置成工具链中的配置文件。
  2. CMAKE_INSTALL_PREFIX: 配置安装三方库路径。
  3. OHOS_ARCH: 配置交叉编译的CPU架构,一般为arm64-v8a(编译64位的三方库)、armeabi-v7a(编译32位的三方库),本示例中我们设置编译64位的cJSON库。
  4. -L: 显示cmake中可配置项目
  1. 执行编译

    cmake执行成功后,在build目录下生成了Makefile,我们就可以直接执行make对cJSON进行编译了:

   make                  # 执行make命令进行编译Scanning dependencies of target cjson[  2%] Building C object CMakeFiles/cjson.dir/cJSON.c.oclang: warning: argument unused during compilation: '--gcc-toolchain=/Users/ohos/sdk/packages/ohos-sdk/darwin/native/llvm' [-Wunused-command-line-argument]/home/owner/workspace/cJSON/cJSON.c:561:9: warning: 'long long' is an extension when C99 mode is not enabled [-Wlong-long]...删除大量 make 日志...clang: warning: argument unused during compilation: '--gcc-toolchain=/Users/ohos/sdk/packages/ohos-sdk/darwin/native/llvm' [-Wunused-command-line-argument][ 97%] Building C object fuzzing/CMakeFiles/fuzz_main.dir/cjson_read_fuzzer.c.oclang: warning: argument unused during compilation: '--gcc-toolchain=/Users/ohos/sdk/packages/ohos-sdk/darwin/native/llvm' [-Wunused-command-line-argument][100%] Linking C executable fuzz_main[100%] Built target fuzz_main
  1. 查看编译后文件属性

    编译成功后我们可以通过file命令查看文件的属性,以此判断交叉编译是否成功,如下信息显示libcjson.so为aarch64架构文件,即交叉编译成功:

   file libcjson.so.1.7.15     # 查看文件属性命令libcjson.so.1.7.15: ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically linked, BuildID[sha1]=c0aaff0b401feef924f074a6cb7d19b5958f74f5, with debug_info, not stripped
  1. 执行安装命令

    编译成功后,我们可以执行make install将编译好的二进制文件以及头文件安装到cmake配置的安装路径下:

   make install                # 执行安装命令[  4%] Built target cjson[  8%] Built target cJSON_test...删除大量make install信息...-- Installing: /Users/ohos/Workspace/usr/cJSON/lib/cmake/cJSON/cJSONConfig.cmake-- Installing: /Users/ohos/Workspace/usr/cJSON/lib/cmake/cJSON/cJSONConfigVersion.cmakels /Users/ohos/Workspace/usr/cJSON                  # 查看安装文件include  libls /Users/ohos/Workspace/usr/cJSON/lib/cmake  libcjson.so  libcjson.so.1  libcjson.so.1.7.15  pkgconfig

测试

交叉编译完后,需要对三方库进行测试验证。为了保证三方库功能的完整性,我们基于原生库的测试用例进行测试验证。为此,我们集成了一套可以在OH环境上进行make、cmake、 ctest等操作的工具,具体请阅读 OH测试环境配置文档。cJSON使用的是ctest方式进行测试的,具体步骤如下:

  1. 测试环境配置

    请参考 OH测试环境配置 。

  2. 准备测试资源

    使用原生库的测试用例进行测试,为了保证测试时不进行编译操作,需要把整个编译的源码作为测试资源包推送到开发板,且需要保证三方库在开发板的路径与编译时路径一致:

   tar -zcvf cJSON.tar.gz cJSON/

打包完资源后需要将资源通过hdc工具将资源包推送到开发板:

   cd /Users/ohos/sdk/packages/ohos-sdk/darwinunzip toolchains-darwin-arm64-4.0.10.5-Release.zip                       # 解压toolchain,hdc工具在toolchain包中export PATH=/Users/ohos/sdk/packages/ohos-sdk/darwin/toolchains:$PATH    # 将hdc命令加载到环境变量中cd ~/Workspace                                                           # 进入到资源所在目录hdc file send cJSON.tar.gz /data/                                        # 推送资源到开发板,保证设备已链接到编译机hdc shell                                                                # 进入开发板系统# mkdir -p /Users/ohos                                                   # 设置与编译时同样的路径# cd /Users/ohos# ln -s Workspace /data/                                                 # 系统根目录空间有限,建议通过软链接配置路径# cd Workspace# tar -zxf cJSON.tar.gz                                                  # 解压测试资源
  1. 执行测试

    进入到cJSON的编译目录build,执行ctest测试命令进行测试:

   # cd /Users/ohos/Workspace/cJSON/build# ctest                                                                    # 执行ctest测试命令,以下为测试信息Test project /Users/ohos/Workspace/cJSON/buildStart  1: cJSON_test1/19 Test  #1: cJSON_test .......................   Passed    0.02 secStart  2: parse_examples2/19 Test  #2: parse_examples ...................   Passed    0.02 secStart  3: parse_number3/19 Test  #3: parse_number .....................   Passed    0.02 secStart  4: parse_hex44/19 Test  #4: parse_hex4 .......................   Passed    0.10 secStart  5: parse_string5/19 Test  #5: parse_string .....................   Passed    0.01 secStart  6: parse_array6/19 Test  #6: parse_array ......................   Passed    0.01 secStart  7: parse_object7/19 Test  #7: parse_object .....................   Passed    0.01 secStart  8: parse_value8/19 Test  #8: parse_value ......................   Passed    0.01 secStart  9: print_string9/19 Test  #9: print_string .....................   Passed    0.01 secStart 10: print_number10/19 Test #10: print_number .....................   Passed    0.01 secStart 11: print_array11/19 Test #11: print_array ......................   Passed    0.01 secStart 12: print_object12/19 Test #12: print_object .....................   Passed    0.01 secStart 13: print_value13/19 Test #13: print_value ......................   Passed    0.01 secStart 14: misc_tests14/19 Test #14: misc_tests .......................   Passed    0.01 secStart 15: parse_with_opts15/19 Test #15: parse_with_opts ..................   Passed    0.01 secStart 16: compare_tests16/19 Test #16: compare_tests ....................   Passed    0.01 secStart 17: cjson_add17/19 Test #17: cjson_add ........................   Passed    0.01 secStart 18: readme_examples18/19 Test #18: readme_examples ..................   Passed    0.01 secStart 19: minify_tests19/19 Test #19: minify_tests .....................   Passed    0.01 sec100% tests passed, 0 tests failed out of 19Total Test time (real) =   0.37 sec

由以上测试结果可以看出,所有测试用例通过!

为了能让大家更好的学习鸿蒙(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.鸿蒙南向开发方向

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在 MySQL 中开启日志记录并排查操作记录

在数据库管理中,能够追踪和审查操作记录是至关重要的。这不仅有助于识别和分析正常的数据库活动,还可以在数据泄露或未经授权的更改发生时进行调查和响应。本文将介绍如何在 MySQL 中开启通用日志记录,并如何排查操作记录。 开启 MySQL 通用…

适配器模式:连接不兼容接口的桥梁

在软件开发中,适配器模式是一种结构型设计模式,它允许不兼容的接口之间进行交互,从而使它们能够一起工作。这个模式经常用于系统升级或集成第三方库的时候,当现有的代码无法直接使用新系统或库提供的接口时,适配器可以…

Vector - CAPL - XCP介绍_02

前面我们介绍了关于使用vector XCP License后,通过CAPL对XCP协议进行连接、断开和获取当前XCP连接状态的函数,本篇文章不做过多的其他赘述,我们继续介绍CAPL控制XCP相关的其他函数。 目录 xcpActivate 代码示例 xcpDeactivate xcpActiva…

Arthas实战教程:定位Java应用CPU过高与线程死锁

引言 在Java应用开发中,我们可能会遇到CPU占用过高和线程死锁的问题。本文将介绍如何使用Arthas工具快速定位这些问题。 准备工作 首先,我们创建一个简单的Java应用,模拟CPU过高和线程死锁的情况。在这个示例中,我们将编写一个…

防汛物资仓库管理系统|实现应急物资仓库三维可视化

系统概述 智慧应急物资仓库可视化系统(智物资DW-S300)采用了 B/S 架构的设计,通过浏览器即可快速登录操作。实现对库房内的应急物资从申购入库、出库、调拨、库内环境监测、维修保养、检测试验、处置报废等全周期、科学、规范的管理。系统以…

【Linux】进程基础铺垫(三)软件基础:系统调用接口

系统调用接口 前言:系统调用接口的引入例子理解 总结小图一、系统调用接口二、底层封装 系统调用接口1. printf && scanf 重新理解 三、库函数 与 系统调用函数 前言:系统调用接口的引入 例子理解 就好比 去银行取钱,银行不可能让你…

车机系统与 Android 的关系概述

前言:搞懂 Android 系统和汽车到底有什么关系。 文章目录 一、基本概念1、Android Auto1)是什么2)功能 2、Google Assistant3、Android Automotive1、Android Auto 和 Android Automotive 的区别 4、App1)App 的开发2)…

Vol.42 推荐几个高质量的独立开发、商业相关的播客

给大家推荐几个播客,这些博客信息密度都挺高的,是我经常听的,分享给大家; 1.代码之外 代码之外 Beyond Code | 小宇宙 - 听播客,上小宇宙 主播是Randy Lu; 2.三五环 三五环 | 小宇宙 - 听播客&#xff0…

js学习总结

这里写目录标题 前情提要JavaScript书写位置1. 内部javaScript (不常用)2. 外部javaScript (常用)3.内联javaScript (常用) js中的输入和输出输出语法1. document.write()2. alert()3. console.log() 输入语法prompt() 前情提要 1. 在javaScript中的 分号 是可以省略的JavaScr…

【算法每日一练]-动态规划(换根dp)会议,医院设置

目录 题目: 会议 思路: 题目:医院设置 思路: 题目: 会议 思路: 首先,阅读题目可以看出来,这道题目实际上就是求树的重心。 树的重心: 定义:找到一个点&a…

基于Java的校园快递一站式服务系统 (源码+文档+包运行)

一.系统概述 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本校园快递一站式服务系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞…

数学:人工智能学习之路上的“拦路虎”及其背后的奥秘

在人工智能的浪潮席卷全球的今天,越来越多的人开始涉足这一领域,以期掌握其核心技术,为未来的科技发展贡献力量。然而,在学习的道路上,许多人却遇到了一个不小的挑战——数学。为何数学会成为学习人工智能的“拦路虎”…