我们目前正在将Qt移植到HarmonyOS。我们的持续集成(CI)和开发机器需要一些专为HarmonyOS构建的第三方库。为该平台交叉编译开源C和C++库一直是一个手动且容易出错的过程。每个库都有自己的构建系统,例如CMake、Autotools或Meson。每个库都需要单独处理才能生成适用于OHOS目标的正确二进制文件。我们一直在维护一个手写的shell脚本,该脚本逐个构建库,并针对每个库的交叉编译问题进行相应的变通处理。
有了我们修改后的vcpkg,现在只需一条命令即可完成该脚本的构建。
为什么选择vcpkg?
vcpkg是微软的开源C/C++包管理器。它已经能够处理Android、iOS和其他嵌入式目标的交叉编译。将HarmonyOS添加为一级平台意味着OHOS开发者无需对每个库的构建系统进行修改,即可使用整个vcpkg移植目录。
Qt从某些版本开始支持使用vcpkg提供的第三方库进行构建,并且Qt 6.11引入了一个配置选项,允许以清单模式运行vcpkg并自动安装依赖项。
遗憾的是,vcpkg之前不支持HarmonyOS,但我们在我们的分叉中解决了这一缺陷。
我们的分叉新增内容
这些更改很小且重点突出。vcpkg-tool分叉(仅提交一次)将ohos添加为可识别的平台标识符。请注意,出于历史原因,我们使用OHOS作为HarmonyOS的同义词。SDK的工具链文件也采用了相同的做法。vcpkg注册表分叉新增了以下内容:
一个OHOS工具链文件,用于委托给HarmonyOS SDK的原生工具链
三个社区三元组:arm64-ohos、arm-ohos和x64-ohos
平台检测功能,使得类似“supports”:“!uwp”这样的端口表达式可以包含或排除OHOS
针对需要OHOS特定调整的库的端口文件补丁(目前包括:libpng、fontconfig和ICU)
入门指南
前提条件
带有原生工具链的HarmonyOS SDK(API 12+)
CMake 3.20+,Ninja
Git
步骤1:从源代码构建vcpkg-tool
上游vcpkg-tool尚不支持OHOS,因此我们从自己的分叉进行构建:
git clone https://git.qt.io/jobor/vcpkg-tool.git -b ohos ~/vcpkg-toolcd ~/vcpkg-toolcmake -S . -B build -GNinja -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTING=OFFninja build
步骤2:设置vcpkg注册表
git clone https://git.qt.io/jobor/vcpkg.git -b ohos ~/vcpkgcd ~/vcpkgcp ~/vcpkg-tool/build/vcpkg ./export VCPKG_ROOT=~/vcpkg
步骤3:设置SDK路径
根据HarmonyOS命令行工具的安装位置:
export OHOS_SDK_ROOT=~/.local/opt/ohos/command-line-tools/sdk/default/openharmony该目录应包含native/build/cmake/ohos.toolchain.cmake文件。
步骤4:安装库
要将库安装到通用安装根目录,我们使用vcpkg的“经典模式”(而非“清单模式”):
vcpkg install --triplet arm64-ohos libpng libjpeg-turbo ...完成!vcpkg会解析依赖关系,下载源代码,使用OHOS工具链交叉编译所有内容,并将头文件、库文件和CMake配置文件安装到$VCPKG_ROOT/installed/arm64-ohos目录。
步骤5:在项目中使用
或者使用vcpkg自带的CMake集成:
cmake -S . -B build \-DCMAKE_TOOLCHAIN_FILE=$VCPKG_ROOT/scripts/buildsystems/vcpkg.cmake \-DVCPKG_TARGET_TRIPLET=arm64-ohos
要指示Qt使用vcpkg,请将QT_USE_VCPKG=ON传递给configure。Qt的构建系统将自动查找vcpkg工具链文件的位置并使用它。
可用的三元组
以下三元组适用于HarmonyOS:
所有三元组都会生成动态链接库,其soname不带版本号。
向上游提交
我们正在努力将这些更改提交到官方的vcpkg和vcpkg-tool代码库。我们的目标是提供标准的社区三元组,使OHOS与Android、iOS和其他交叉编译平台一起成为vcpkg的一流目标平台。
一旦合并到上游,就不需要任何分叉。标准的vcpkg安装将开箱即用地支持OHOS。
结论
将HarmonyOS支持添加到vcpkg可以消除目前每个OHOS C/C++开发人员面临的每个库单独进行交叉编译的负担。无需为每个依赖项维护自定义构建脚本,构建配方都位于一个由社区维护的仓库中。
如果您正在为HarmonyOS构建原生库,请尝试我们的vcpkg分叉,并告诉我们它的使用体验。