本文记录了将 Boost C++ 库(版本 1.83.0)成功交叉编译到 HarmonyOS PC 平台的完整过程。Boost 使用其独特的 Boost.Build(b2/bjam)构建系统,在交叉编译场景下遇到了多个挑战,包括工具链配置、子模块初始化、项目依赖等问题。通过系统性的问题排查和解决,最终成功构建并打包为 HNP(HarmonyOS Native Package)格式。

1. 背景
1.1 项目需求
  • 目标平台: HarmonyOS PC(ARM64 架构)
  • 构建平台: macOS(ARM64)
  • Boost 版本: 1.83.0
  • 构建系统: Boost.Build (b2/bjam)
  • 输出格式: HNP 包
1.2 技术挑战

Boost 使用自定义的构建系统 Boost.Build,而不是标准的 Makefile 或 CMake。在交叉编译场景下,主要挑战包括:

  1. 工具链配置: 需要正确配置 HarmonyOS SDK 提供的 LLVM 工具链
  2. 子模块依赖: Boost 使用 git submodules,需要正确初始化多个子模块
  3. 项目依赖: Boost.Build 的项目依赖关系复杂,需要正确处理
  4. 构建顺序: headers 和 libraries 的构建顺序有严格要求
2. 环境准备
2.1 工具链信息

HarmonyOS SDK 提供的交叉编译工具链位于:

代码语言:javascript

AI代码解释

/Users/jianguo/Desktop/ohosdk/native/llvm/bin/

关键工具:

  • clang++: C++ 编译器
  • ld.lld: 链接器
  • llvm-ar: 归档工具
  • llvm-ranlib: 索引工具
2.2 编译标志

代码语言:javascript

AI代码解释

CXXFLAGS="-fPIC -D__MUSL__=1 -D__OHOS__ -fstack-protector-strong \
          --target=aarch64-linux-ohos \
          --ld-path=/path/to/ld.lld \
          --sysroot=/path/to/sysroot"

LDFLAGS="--ld-path=/path/to/ld.lld \
         --target=aarch64-linux-ohos \
         --sysroot=/path/to/sysroot"
3. 问题排查与解决
3.1 问题一:工具集版本错误

错误信息:

代码语言:javascript

AI代码解释

error: arm64 in arm64 is not a number

原因分析: 在 user-config.jam 中,工具集版本被错误地设置为 arm64,而 Boost.Build 期望的是数字版本号。

解决方案: 使用空版本号,让 Boost.Build 使用我们指定的完整编译器路径:

代码语言:javascript

AI代码解释

# user-config.jam
using clang : : /path/to/clang++ 
    : <cxxflags>"${CXXFLAGS}"
      <linkflags>"${LDFLAGS}"
      <archiver>${AR}
      <ranlib>${RANLIB}
    ;

对应的构建选项:

代码语言:javascript

AI代码解释

BJAM_OPTIONS="toolset=clang"
3.2 问题二:编译器查找失败

错误信息:

代码语言:javascript

AI代码解释

error: toolset clang-darwin initialization: version '1.0' requested but 
'clang++-1.0' not found and version '16.0.0' of default 'clang++' does not match.

原因分析: Boost.Build 尝试查找版本化的编译器(如 clang++-1.0),但我们的交叉编译器是完整路径,不存在版本化的可执行文件。解决方案: 在 user-config.jam 中使用空版本号(冒号后直接跟编译器路径),这样 Boost.Build 会使用我们指定的完整路径,而不是尝试查找版本化的编译器。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐