通用三方库鸿蒙化适配一篇搞定从环境到交叉编译(MAC篇)
适用读者需在macOS上为 OpenHarmony 准备C/C 交叉编译 SDK并希望通过官方tpc_c_cplusplus仓库的lycium完成编译与设备测试的开发者。本文说明OpenHarmony SDK的获取、解压与环境变量可与更大文档中的「第 2 章」编号2.1.x对照使用。范围说明完成本文 SDK 部分后宿主机已具备clang、cmake、ohos、hnpcli等命令。若脱离 lycium 自行用 CMake 交叉编译通常还需显式指定CMAKE_TOOLCHAIN_FILE、OHOS_ARCH等见文末。目录前置条件OpenHarmony SDK 安装交叉编译示例以 cJSON 为例常见问题FAQ前置条件架构与产物SDK 的native-*、toolchains-*压缩包名中的darwin-arm64对应 Apple SiliconM 系列darwin-x86_64或页面所示 Intel/amd64 命名对应 Intel Mac。须与当前机器一致避免错下包导致无法运行。磁盘SDK 解压后体积较大建议预留≥ 10 GB可用空间以实际包为准。下载访问DCP 页面 每日构建列表 若需登录、内网或 VPN请按所在组织要求访问。OpenHarmony SDK 安装2.1.1 下载 SDK环境搭建在浏览器中打开 DCP 每日构建列表https://dcp.openharmony.cn/workbench/cicd/dailybuild/dailylist在列表中按本机操作系统选择对应产物开发机系统选择产物关键词macOSmac-sdk-fullMac 版 SDK 包版本与目标一致尽量选择与目标 OpenHarmony 设备/镜像/工程匹配的 SDK 版本或同一主版本线减少头文件、API 或工具行为不一致问题。下载到本机后解压外层包请将文件名替换为你实际下载的包名cd~# macOS 示例包名以 DCP 页面为准tar-zxvf你下载的-sdk-xxx.tar.gz解压后若得到的是带版本号的一层目录例如ohos-sdk-xxx/请先cd到该目录或将其重命名为你计划使用的根路径例如~/ohos-sdk保证后续步骤里的OHOS_SDK指向层内已包含「待解压的native-*.zip/toolchains-*.zip」或与 DCP 说明一致的根目录。再进入ohos-sdk根目录解压darwin-*对应的 zip文件名以你本机包内列表为准下例版本号与架构仅作演示Intel Mac 请改用darwin-x86_64等页面上的命名cd~/ohos-sdk# 按你实际上一步得到的 SDK 根目录修改tar-zxvfnative-darwin-arm64-6.0.0.46-Beta1.zip# 以实际包名为准tar-zxvftoolchains-darwin-arm64-6.0.0.46-Beta1.zip# 以实际包名为准解压完成后应得到native/、toolchains/等目录含llvm、sysroot、hnpcli等再配置环境变量。2.1.2 SDK 目录结构ohos-sdk/ ├── native/ │ ├── llvm/bin/ # 编译器工具链 │ ├── sysroot/ # 系统根目录头文件和库 │ └── build-tools/ # 构建工具含 cmake 等布局随版本可能略有差异 └── toolchains/ └── hnpcli # HNP 打包工具部分版本可能在 toolchains/bin 下2.1.3 环境变量配置编辑~/.zshrc如果使用 zsh或~/.bash_profile如果使用 bash# OpenHarmony SDK 路径与解压后的根目录一致exportOHOS_SDK~/ohos-sdk# 添加到 PATHexportPATH$OHOS_SDK/native/llvm/bin:$PATHexportPATH$OHOS_SDK/native/build-tools/cmake/bin:$PATH# hnpcli 可能在 toolchains 根目录或 toolchains/bin两处均加入可避免版本差异exportPATH$OHOS_SDK/toolchains/bin:$PATHexportPATH$OHOS_SDK/toolchains:$PATH# 验证修改配置后执行其一source~/.zshrc使用fish等其他 shell 时请用对应语法设置OHOS_SDK与PATH。2.1.4 验证 SDK 配置# 检查 SDK 路径echo$OHOS_SDK# 检查工具是否在 PATH 中whichclangwhichcmakewhichhnpcli# 检查 SDK 工具目录ls$OHOS_SDK/native/llvm/bin/ls$OHOS_SDK/native/build-tools/cmake/bin/ls$OHOS_SDK/toolchains/# 验证工具版本clang--versioncmake--versionhnpcli--version若which hnpcli仍为空请在该 SDK 的toolchains下查找hnpcli实际位置并把其所在目录追加到PATH。交叉编译示例以 cJSON 为例tpc_c_cplusplus以下按流程说明克隆openharmony-sig/tpc_c_cplusplus后使用已有目录thirdparty/cJSON/中的适配脚本在 Mac 上交叉编译并在设备上跑测试。仓库内HPKBUILD / HPKCHECK为完整版此处只摘与流程相关的核心片段。说明build.sh的参数是thirdparty下的目录名本例为cJSON大小写与文件夹一致。测试在OpenHarmony 设备上执行不能在 macOS 上直接跑交叉编译出的测试二进制。本机额外依赖Macbrewinstallcmakemakeautoconf automake libtool pkg-config ninjacurlwget详见仓库 lycium/README.md、lycium/Buildtools。流程概览步骤做什么1克隆仓库2看thirdparty/cJSON/里HPKBUILD / HPKCHECK一般无需改即可试编3设置OHOS_SDK在lycium/执行./build.sh cJSON4设备准备CItools整仓路径对齐后执行./test.sh cJSON步骤一克隆官方框架cd~/work# 换成你的工作目录gitclone https://atomgit.com/openharmony-sig/tpc_c_cplusplus.gitcdtpc_c_cpluspluslycium/build.sh、lycium/test.sh编译与测试入口thirdparty/cJSON/本例适配目录HPKBUILD、HPKCHECK、README 等步骤二适配文件在做什么cJSON源码由HPKBUILD的source在首次构建时下载到thirdparty/cJSON/下builddir解压后为cJSON-1.7.19与pkgverv1.7.19对应去掉 tag 前缀v。HPKBUILD 要点变量名 prepare/build/package主干pkgnamecJSONpkgverv1.7.19archs(armeabi-v7aarm64-v8a)sourcehttps://github.com/DaveGamble/$pkgname/archive/refs/tags/$pkgver.tar.gzbuildtoolscmakebuilddir$pkgname-${pkgver:1}# cJSON-1.7.19prepare(){mkdir-p$builddir/$ARCH-build}build(){cd$builddirPKG_CONFIG_LIBDIR${pkgconfigpath}${OHOS_SDK}/native/build-tools/cmake/bin/cmake$\-DOHOS_ARCH$ARCH-B$ARCH-build -S./-L$buildlog21$MAKEVERBOSE1-C$ARCH-build$buildlog21cd$OLDPWD}package(){cd$builddir$MAKEVERBOSE1-C$ARCH-buildinstall$buildlog21cd$OLDPWD}cleanbuild(){rm-rf${PWD}/$builddir}HPKCHECK 要点与仓库thirdparty/cJSON/HPKCHECK一致用LYCIUM_THIRDPARTY_ROOT拼出构建目录绝对路径保证设备上工作目录无关为musl运行时把${ARCH}-build置于LD_LIBRARY_PATH首位若存在/usr/CIusr/bin则优先加入PATHcmake/ctest 常见位置最后ctest写入logfile。sourceHPKBUILD/dev/null21logfile${LYCIUM_THIRDPARTY_ROOT}/${pkgname}/${pkgname}_${ARCH}_${OHOS_SDK_VER}_test.logopenharmonycheck(){res0build_abs${LYCIUM_THIRDPARTY_ROOT}/${pkgname}/${builddir}/${ARCH}-buildcd$build_abs||return1[-d/usr/CIusr/bin]exportPATH/usr/CIusr/bin:${PATH}exportLD_LIBRARY_PATH${build_abs}:${LYCIUM_ROOT}/usr/${pkgname}/${ARCH}/lib:${LD_LIBRARY_PATH}ctest--timeout40000${logfile}21res$?cd$OLDPWDreturn$res}完整脚本还会在失败时备份Testing/Temporary/LastTest.log到LYCIUM_FAULT_PATH/${pkgname}/。新建其它库时在thirdparty/目录名/从lycium/template/拷贝模板按上游改source、builddir、build()等HPKCHECK里cd的构建目录必须与 HPKBUILD 一致文件换行保持LF。步骤三交叉编译exportOHOS_SDK~/ohos-sdk# 与本文 2.1.3 一致按实际路径修改cd/path/to/tpc_c_cplusplus/lycium ./build.sh cJSON多库时./build.sh cJSON 其他库名若A依赖B参数里要带上B。产物示例lycium/usr/cJSON/arm64-v8a/lib/、include/等以实际 install 为准。macOS构建阶段一般不在宿主机执行check()验证走步骤四。步骤四测试说明lycium/test.sh需在 OpenHarmony 设备上运行仓库内注释已写明。Mac 上生成的armeabi-v7a-build/arm64-v8a-build内为ELF musl测试程序不能当 macOS 本地程序执行。按 lycium/CItools 在设备上准备cmake / ctest / perl等。将tpc_c_cplusplus同步到设备含thirdparty/、lycium/usr/、各库…/ARCH-build/路径尽量与编译机一致。在设备上cd到lycium使LYCIUM_ROOTpwd与test.sh一致执行./test.sh cJSON。PATH /LD_LIBRARY_PATH由test.sh与HPKCHECK协同处理。仅手搓 cJSON 单库验证在设备上进入thirdparty/cJSON/cJSON-1.7.19/ARCH-buildARCH与你要测的架构一致musl不会默认加载当前目录的.so须先exportLD_LIBRARY_PATH$PWD:${LD_LIBRARY_PATH}ctest--timeout40000--output-on-failure预期结果19条用例全部通过时输出100% tests passed, 0 tests failed out of 19。异常时执行ls -la libcjson.so*检查.so实体与符号链接是否随目录同步。更多排错见下文常见问题FAQ。常见问题FAQSDK 与 macOSQbuild.sh提示OHOS_SDK 未设置A未导出OHOS_SDK。写入~/.zshrc/~/.bash_profile后source或每次执行export OHOS_SDK/你的/sdk/根根目录下须存在native/llvm/bin。QApple Silicon 与 Intel Mac 怎么选 zipAdarwin-arm64对应M 系列darwin-x86_64或页面所述 amd64对应Intel与「关于本机」一致即可。Qwhich cmake/which hnpcli为空A核对PATH是否包含$OHOS_SDK/native/build-tools/cmake/bin、$OHOS_SDK/toolchains及toolchains/binhnpcli有时在toolchains根目录。QDCP 页面打不开A按环境使用 VPN/内网或改用组织允许的其他 SDK 获取方式如 AtomGit 发布说明目录 等。lyciumQ./build.sh写cjson还是cJSONA与thirdparty/下文件夹名一致示例为./build.sh cJSON。Q多库编译报依赖错误A./build.sh的参数里需包含被依赖库详见 lycium/README.md — 快速编译。Qsource HPKBUILD语法错、command not foundA多为CRLF。sed s/\r$// HPKBUILD HPKBUILD.lf mv HPKBUILD.lf HPKBUILDHPKCHECK同理。设备测试与 cJSONQMac 上对*-build跑ctest全挂A那是交叉编译的 ELF不是 macOS 可执行文件。请在OpenHarmony 设备上测或另建本机原生build 目录。Qlibcjson.so.1: No such file or directoryAmusl需LD_LIBRARY_PATH包含$PWD构建目录或lycium/usr/cJSON/ARCH/lib。用./test.sh时HPKCHECK已处理手工测见步骤四第 4 步。Q./test.sh找arm64-v8a-build设备上只有armeabi-v7a-buildAtest.sh根据getconf LONG_BIT定ARCH64 →arm64-v8a。64 位板需同步arm64-v8a-build或在 Mac 上编出双架构后整仓同步。Q./tests不能执行Atests是目录。用ctest或./cJSON_test。Q测试日志文件名里的 SDK 版本字符串不对Alycium/test.sh内OHOS_SDK_VER为示例值如OpenHarmony_4.0.8.1需按你当前系统/SDK 改为一致否则仅影响log 文件名与展示不挡ctest本身。 至此完成了从零到一的通用三方库快速交叉编译构建工作。