使用 vcpkg 为鸿蒙(HarmonyOS / OHOS)下载与安装三方库实践指南

面向鸿蒙原生 C/C++ 开发时,三方库数量多、构建系统各异,依赖管理很容易变成脚本堆叠与不可复现的 CI 问题。QT官方最近分享和贡献了支持HarmonyOS系统的vcpkg ,这是个好消息,感谢QT官方的贡献!本文从 vcpkg 的定位出发,说明它在 OHOS( HarmonyOS)交叉编译场景下的价值,并给出可执行的搭建与安装步骤;文末集中列出参考与仓库地址。


QT官方2026年4月10号分享和贡献了支持HarmonyOS系统的vcpkg,这意味着海量的三方库(上千个)鸿蒙化移植从此变得简单了,借助QT官方修改后的 vcpkg 分支,只需一条命令即可完成三方库的安装。且vcpkg本身是跨平台的,跟windows下的使用习惯一致。

QT官方介绍博文链接https://www.qt.io/blog/building-libraries-for-harmonyos-with-vcpkg

"我们目前正在将 Qt 移植到HarmonyOS。我们的持续集成 (CI) 和开发机器需要一些专为 HarmonyOS 构建的第三方库。为该平台交叉编译开源 C 和 C++ 库一直以来都是一个手动且容易出错的过程。每个库都有自己的构建系统,例如 CMake、Autotools 或 Meson。每个库都需要单独处理才能生成适用于 OHOS 目标的正确二进制文件。我们一直维护着一个手写的 shell 脚本,该脚本逐个构建库,并针对每个库的交叉编译问题提供相应的变通方案。现在,借助我们修改后的 vcpkg 分支,该脚本只需一条命令即可完成。"

相关资源(建议收藏)

说明 地址
Qt 官方博文(背景、动机与步骤原文) Building C/C++ libraries for HarmonyOS with vcpkg
Qt 侧 vcpkg 仓库(ohos 分支,含 registry 与 OHOS 相关改动) https://git.qt.io/jobor/vcpkg
Qt 侧 vcpkg-tool 仓库(ohos 分支,可执行工具本体) https://git.qt.io/jobor/vcpkg-tool
vcpkg 国内镜像 (作者同步到 GitCode,clone 往往比直连 git.qt.io 更快;非 Qt 官方托管,使用前请自行核对分支与提交) https://gitcode.com/qq8864/vcpkg

git.qt.io 拉取大仓库时,网络不稳定或速度偏慢是常见情况;registry(vcpkg) 可优先尝试上表 GitCode 镜像(或者自己fork一份),vcpkg-tool 仍以 Qt 官方仓为准(当前未提供镜像地址时,可配合代理或浅克隆 git clone --depth 1 等策略)。


目录

  1. [什么是 vcpkg](#什么是 vcpkg)
  2. 鸿蒙生态与三方库构建的痛点
  3. [使用 vcpkg 管理鸿蒙三方库的重大意义](#使用 vcpkg 管理鸿蒙三方库的重大意义)
  4. [Qt 团队为鸿蒙做的 vcpkg 扩展(fork 现状)](#Qt 团队为鸿蒙做的 vcpkg 扩展(fork 现状))
  5. 环境准备
  6. [从零搭建:vcpkg-tool 与 registry](#从零搭建:vcpkg-tool 与 registry)
  7. 安装三方库与典型工作流
  8. [在 CMake 工程中使用](#在 CMake 工程中使用)
  9. [与 Qt 构建的集成要点](#与 Qt 构建的集成要点)
  10. [可用 triplet 与产物特征](#可用 triplet 与产物特征)
  11. 上游化与长期维护展望
  12. 相关问题FAQ
  13. 小结与建议
  14. 参考文献与链接

1. 什么是 vcpkg

vcpkg 是微软开源的 C/C++ 包管理器,面向原生库与工具链生态,核心能力包括:

  • 统一入口:用同一套命令与元数据(port)描述大量开源库的获取、配置、编译与安装。
  • 跨平台与交叉编译 :除 Windows、Linux、macOS 等主机平台外,社区与官方长期维护对 Android、iOS 等目标的交叉编译支持;各类 fork 也会为新兴平台补充 toolchain 与 triplet。
  • 依赖解析:自动处理依赖树、版本约束与构建顺序,减少"手工拼 Makefile / 逐个改 CMake 交叉参数"的成本。
  • 与 CMake 深度集成 :通过 scripts/buildsystems/vcpkg.cmake 等机制,让业务工程以标准 CMake 方式消费已安装的库与配置文件。

它已经能够处理 Android、iOS 和其他嵌入式目标的交叉编译。将 HarmonyOS 添加为一级平台意味着 OHOS 开发人员无需对每个库的构建系统进行修改,即可使用整个 vcpkg 移植目录。

对鸿蒙而言,vcpkg 可以把 "每个库一套脚本、一套坑" 收敛为 "平台 triplet + 少量 port 补丁 + 一条安装命令"


2. 鸿蒙生态与三方库构建的痛点

在将 Qt 等大型框架移植到鸿蒙、或在鸿蒙上直接开发原生模块时,往往需要大量第三方库(图像编解码、网络、国际化、字体与渲染相关依赖等)。这类工作里常见的问题包括:

痛点 说明
构建系统碎片化 同一依赖可能分别使用 CMake、Autotools、Meson 等,交叉编译参数与探测逻辑各不相同。
手工流程易错 维护"按库编写 shell 脚本 + 每库 workaround"的方式难以规模化,CI 与多开发者机器难以复现。
平台差异隐蔽 OHOS SDK 的 toolchain、ABI、动态库命名(如 soname 策略)等与 Linux/Android 并不完全等价,需要集中治理。

因此,团队通常需要 可复现、可缓存、可版本化 的依赖安装方案;vcpkg 是契合该方向的工具之一。


3. 使用 vcpkg 管理鸿蒙三方库的重大意义

将 vcpkg 用于鸿蒙三方库安装,大致可以概括成下面几条。

3.1 从"脚本集合"到"单一命令"

手写 shell 逐库处理交叉编译怪癖,维护成本很高;在引入带 OHOS 支持的 vcpkg fork 后,日常操作可以收敛为 一条 vcpkg install --triplet <ohos-triplet> ...(具体 triplet 见第 10 节),显著降低维护与培训成本。

3.2 让 vcpkg 的 port 目录成为"公共资产"

vcpkg 的 port 目录 由社区持续维护:版本升级、补丁、依赖声明、平台表达式等都以结构化方式沉淀。对 OHOS 而言,一旦平台在 fork 或上游里稳定落地,海量库的构建配方不必在每个业务仓库重复发明。

3.3 提升 CI 与团队协作一致性

统一 VCPKG_ROOT、统一 triplet、统一 OHOS_SDK_ROOT,再配合缓存(二进制缓存或制品库策略),可以让 开发机、CI、发布流水线 对三方库的来源与哈希达成一致,减少"我机器上能编、你机器上链接不过"的问题。

3.4 与 CMake / Qt 生态自然衔接

Qt 已支持使用 vcpkg 提供的三方库进行构建Qt 6.11 起,configure 还可配合 manifest 模式 在配置阶段自动安装依赖,让"应用/框架构建"和"原生依赖供给"的边界更清晰。

当前 OHOS 相关支持主要集中在 Qt 维护的 vcpkg / vcpkg-tool fork;微软上游仓库仍在推进合并(见第 11 节)。


4. Qt 团队为鸿蒙做的 vcpkg 扩展(fork 现状)

这套 fork 的改动刻意保持 小而聚焦,大致分两块。

4.1 vcpkg-tool fork(约一个提交)

  • 在工具链侧将 ohos 识别为合法的平台标识符
  • 材料里常把 OHOS 与 HarmonyOS 当作同一语境下的表述;SDK 的 toolchain 文件也沿用相同命名习惯。

4.2 vcpkg registry fork

registry 侧主要增加:

  • OHOS toolchain 文件:委托给 HarmonyOS SDK 自带的 native toolchain。
  • 三组社区 tripletarm64-ohosarm-ohosx64-ohos
  • 平台检测能力 :使 port 表达式(例如 "supports": "!uwp" 一类)能够 包含或排除 OHOS
  • portfile 补丁 :已知需要 OHOS 单独适配的库里,当前包含 libpng、fontconfig、ICU 等(具体列表会随分支演进变化,以仓库为准)。

5. 环境准备

建议准备如下环境(与 Qt 侧公开文档中的要求对齐,可减少踩坑概率):

组件 要求
HarmonyOS SDK 需包含 native 工具链 ,建议 API 12+
CMake 3.20+
Ninja 用于生成高效构建
Git 克隆 fork 仓库

企业内网若无法直连 git.qt.io,请配置代理,或对 vcpkg 使用文首表格中的 GitCode 镜像。


6. 从零搭建:vcpkg-tool 与 registry

下面给出一种常见目录布局;可将 ~/ 换成你的linux工作目录(Windows 下建议使用无空格路径)。

这里以linux操作系统主机环境 Ubuntu24.04为例:

6.1 构建 vcpkg-tool(从 fork 源码)

上游 vcpkg-tool 尚未识别 OHOS,因此需要从 Qt fork 构建:

构建vcpkg命令行可执行文件:

bash 复制代码
git clone https://git.qt.io/jobor/vcpkg-tool.git -b ohos ~/vcpkg-tool
cd ~/vcpkg-tool
cmake -S . -B build -GNinja -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTING=OFF
ninja -C build

最终生成了构建产物vcpkg可执行文件。

若 上面的clone 偏慢,可尝试浅克隆:git clone --depth 1 -b ohos ...(注意浅克隆对后续 git pull 与部分工作流的影响)。

或者从我的gitcode镜像(https://gitcode.com/qq8864/vcpkg-tool )clone:

bash 复制代码
git clone https://gitcode.com/qq8864/vcpkg-tool.git -b ohos ~/vcpkg-tool
git clone https://gitcode.com/qq8864/vcpkg.git -b ohos ~/vcpkg

6.2 准备 vcpkg registry,并放入构建好的 vcpkg 可执行文件

registry 建议二选一(官方源与镜像需保持同一 ohos 分支语义,切换后请自行 git remote -v / git log 核对):

bash 复制代码
# 方式 A:Qt 官方 GitLab
git clone https://git.qt.io/jobor/vcpkg.git -b ohos ~/vcpkg

# 方式 B:GitCode 镜像(通常 clone 更快,见文首说明)
git clone https://gitcode.com/qq8864/vcpkg.git -b ohos ~/vcpkg
bash 复制代码
cd ~/vcpkg
cp ~/vcpkg-tool/build/vcpkg ./
export VCPKG_ROOT=~/vcpkg

6.3 设置 HarmonyOS SDK 路径

路径随本机安装位置变化,下面仅为示例:

bash 复制代码
export OHOS_SDK_ROOT=~/.local/opt/ohos/command-line-tools/sdk/default/openharmony

我的linux下的HarmonyOS的SDK路径如下:

bash 复制代码
export OHOS_SDK_ROOT=/root/ohos-sdk/linux/

附 HarmonyOS的SDK下载地址

bash 复制代码
sdk_download_url="https://cidownload.openharmony.cn/version/Daily_Version/OpenHarmony_6.1.0.27/20260111_020523/version-Daily_Version-OpenHarmony_6.1.0.27-20260111_020523-ohos-sdk-public.tar.gz"
curl -o ohos-sdk-public.tar.gz $sdk_download_url
mkdir ohos-sdk
tar -zxf ohos-sdk-public.tar.gz -C ohos-sdk

cd ~/ohos-sdk/linux
unzip native-linux-x64-6.1.0.27-Beta1.zip
unzip toolchains-linux-x64-6.1.0.27-Beta1.zip

校验点:该目录下应存在:

native/build/cmake/ohos.toolchain.cmake

若路径不正确,后续 CMake 交叉阶段通常会立即失败。


7. 安装三方库与典型工作流

下面以 classic 模式(与 manifest 模式相对)为例:把库装到统一前缀,便于多项目共享。

bash 复制代码
vcpkg install --triplet arm64-ohos libpng libjpeg-turbo

要点:

  • --triplet 选择目标 ABI(见第 10 节)。
  • 可在命令末尾继续追加包名;vcpkg 会解析依赖并顺序构建。
  • 默认安装根为:$VCPKG_ROOT/installed/<triplet>/(包含头文件、库、以及许多库的 CMake config)。

实际项目中建议:将 VCPKG_ROOTOHOS_SDK_ROOT、triplet 写入团队文档或 CI 变量,并对 installed 目录或二进制缓存策略达成一致。


8. 在 CMake 工程中使用

CMake 与 vcpkg 的经典集成写法如下:

bash 复制代码
cmake -S . -B build \
  -DCMAKE_TOOLCHAIN_FILE=$VCPKG_ROOT/scripts/buildsystems/vcpkg.cmake \
  -DVCPKG_TARGET_TRIPLET=arm64-ohos

含义简述:

  • vcpkg.cmake:把 vcpkg 的安装前缀、查找路径、工具链逻辑注入到你的工程。
  • VCPKG_TARGET_TRIPLET :告诉 vcpkg 与 CMake 正在为哪一个 OHOS ABI 产出

若工程还依赖 OHOS NDK/SDK 的其它变量,请按官方 SDK 文档与示例工程一并配置(本文不替代 SDK 官方文档)。


9. 与 Qt 构建的集成要点

  • 配置 Qt 时传入 QT_USE_VCPKG=ON,构建系统会自动定位 vcpkg toolchain 并走对应集成路径。
  • Qt 6.11 起,configure 可配合 manifest 模式 自动安装依赖(适合"源码树声明依赖、配置即拉取"的工作流)。

选项名称与行为细节以你所用 Qt 版本 的官方文档为准。


10. 可用 triplet 与产物特征

三组 triplet 与 ABI 对应关系如下:

Triplet OHOS ABI
arm64-ohos arm64-v8a
arm-ohos armeabi-v7a
x64-ohos x86_64

这些 triplet 会产出 动态链接库 ,且具有 无版本后缀的 soname(unversioned sonames)。打包、运行时查找与升级策略上需要团队提前约定(例如随应用分发、或依赖系统镜像中的同名库时的冲突风险)。


11. 上游化与长期维护展望

公开信息里提到,相关改动在往 官方 vcpkg 与 vcpkg-tool 合并;长期目标是让 OHOS 与 Android、iOS 等一样,成为 标准社区 triplet 目标,从而在远期减少对 fork 的依赖,用标准 vcpkg 安装即可覆盖 OHOS。

在 upstream 完成之前,团队应关注:

  • fork 分支与上游的差异更新节奏;
  • 安全补丁与 CVE 修复如何在 port 层同步;
  • 二进制缓存与供应链审计(来源、哈希、可复现构建)。

12. 相关问题FAQ

1. github下载速度太慢,超时报错:

从镜像站(https://ghproxy.link/)下载:

bash 复制代码
wget https://ghfast.top/https://github.com/Kitware/CMake/releases/download/v3.31.10/cmake-3.31.10-linux-x86_64.tar.gz

将下载好的 .tar.gz 文件上传到服务器的 ~/vcpkg/downloads 目录下。

或者直接使用wget下载到downloads目录下,如:

bash 复制代码
root@VM-0-12-ubuntu:~/vcpkg$ 
wget -P downloads https://ghfast.top/https://github.com/openssl/openssl/archive/openssl-3.6.1.tar.gz
#或者:
wget -O ~/vcpkg/downloads/openssl-openssl-openssl-3.6.1.tar.gz https://ghfast.top/https://github.com/openssl/openssl/archive/openssl-3.6.1.tar.gz
bash 复制代码
# 设置环境变量,使用代理加速(这里以一个常用的 GitHub 加速代理为例)
export VCPKG_DOWNLOAD_MODE=allow
export VCPKG_DOWNLOADS_URL_TEMPLATE="https://ghproxy.com{path}"

# 再次尝试安装
./vcpkg install --triplet arm64-ohos libpng


恭喜,你的安装已经成功了!

日志最后的 All requested installations completed successfully 表明 libpng 及其依赖项 zlib 的编译、安装和包校验都已经完成,你现在可以直接在项目中使用它。

至于图中的报错内容 sh: 1: zip: not found。

这是因为 vcpkg 在成功安装包后,会尝试调用系统的 zip 命令将安装好的二进制文件压缩,存入二进制缓存(Binary Cache)。由于我的 Ubuntu 系统中没有安装 zip 工具,导致缓存动作失败。但这没有实际的影响。(如果想消除这个报错并开启缓存功能,只需在 Ubuntu 上安装 zip 工具)

库已经正确安装到了 vcpkg/packages 目录下,你的编译和链接逻辑可以正常运行。

2.如何验证编译出的是ohos平台下的?

要验证针对 arm64-ohos(鸿蒙 arm64 架构)交叉编译的库是否可用,通常有两种验证方式:静态检查(检查文件格式)和编译链接验证(编写测试程序)。

  1. 静态检查:验证文件架构(最快速)
bash 复制代码
root@VM-0-12-ubuntu:~/vcpkg/packages/libpng_arm64-ohos# cd lib/
root@VM-0-12-ubuntu:~/vcpkg/packages/libpng_arm64-ohos/lib# ls
libpng16.so  libpng.so  pkgconfig
root@VM-0-12-ubuntu:~/vcpkg/packages/libpng_arm64-ohos/lib# /root/ohos-sdk/linux/native/llvm/bin/llvm-readelf libpng16.so
root@VM-0-12-ubuntu:~/vcpkg/packages/libpng_arm64-ohos/lib# /root/ohos-sdk/linux/native/llvm/bin/llvm-readelf -h libpng16.so
ELF Header:
  Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
  Class:                             ELF64
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              DYN (Shared object file)
  Machine:                           AArch64
  Version:                           0x1
  Entry point address:               0x0
  Start of program headers:          64 (bytes into file)
  Start of section headers:          274432 (bytes into file)
  Flags:                             0x0
  Size of this header:               64 (bytes)
  Size of program headers:           56 (bytes)
  Number of program headers:         11
  Size of section headers:           64 (bytes)
  Number of section headers:         41
  Section header string table index: 38

预期输出:

Class: ELF64

Machine: AArch64

OS/ABI: (通常会显示为 UNIX - System V 或特定的 OHOS 标识)

  1. 编译链接验证:编写测试程序
    创建一个简单的 C++ 文件 test_png.cpp,调用 libpng 的函数。
c 复制代码
#include <png.h>
#include <iostream>

int main() {
    // 调用 libpng 库函数获取版本信息
    const char* version = png_get_libpng_ver(nullptr);
    if (version) {
        std::cout << "libpng version: " << version << std::endl;
        return 0;
    }
    return 1;
}

3.下载安装库报错:error: vcpkg was unable to detect the active compiler's information

如果按照前面正确操作步骤是没错的。以下报错是因为没有设置OHOS_ROOT_SDK路径导致的:
CMake Error at /root/vcpkg/scripts/toolchains/ohos.cmake:22 (message): Could not find the OHOS SDK. Set the OHOS_SDK_ROOT environment variable to

解决办法:

bash 复制代码
export OHOS_SDK_ROOT=/root/ohos-sdk/linux/

4.下载安装openssl库报错:

这个问题呢,就是当前QT官方刚推出的vcpkg分支存在的问题了:

部分库的portfile.cmake移植脚本还没有完全的支持鸿蒙平台。这个呢,你自己也可以参与贡献或者根据提示来解决:

根据报错提示,找到/root/vcpkg/ports/openssl/unix/portfile.cmake 文件的第122行:

增加ohos鸿蒙平台的支持:

bash 复制代码
elseif(VCPKG_TARGET_IS_OHOS)  # 新增这一段,支持OHOS平台
      vcpkg_cmake_get_vars(cmake_vars_file)
      include("${cmake_vars_file}")
      string(APPEND VCPKG_C_FLAGS " --target=${VCPKG_DETECTED_CMAKE_C_COMPILER_TARGET}")
      string(APPEND VCPKG_CXX_FLAGS " --target=${VCPKG_DETECTED_CMAKE_CXX_COMPILER_TARGET}")
else()
    message(FATAL_ERROR "Unknown platform")
endif()

这段代码的作用是将 CMake 探测到的底层编译器目标架构(Target Triple)强制同步给 vcpkg 的编译参数。

它是交叉编译(Cross-Compilation)中的关键步骤,

具体拆解如下:

  1. vcpkg_cmake_get_vars(cmake_vars_file)
    功能:这会启动一个精简的 CMake 环境,利用你提供的鸿蒙工具链(Toolchain)去探测编译器的各种属性。
    探测内容:它会找出编译器实际使用的 C/C++ 标准、宏定义、以及最重要的------Target Triple(例如 aarch64-linux-ohos)。
  2. include("${cmake_vars_file}")
    功能:将上述探测到的结果导入到当前的脚本上下文中。
    结果:导入后,你就可以使用以 VCPKG_DETECTED_ 开头的变量,比如 ${VCPKG_DETECTED_CMAKE_C_COMPILER_TARGET}。
  3. string(APPEND VCPKG_C_FLAGS " --target=...")
    功能:核心步骤。将探测到的目标架构字符串(如 aarch64-linux-ohos)以 --target 参数的形式追加到全局编译指令中。

为什么需要它?

防止"张冠李戴":Clang 是一个通用编译器。即使你调用了鸿蒙 SDK 里的 Clang,如果你不显式告诉它 --target=aarch64-linux-ohos,它可能会默认按照宿主机(你的 Ubuntu x86_64)去编译,导致生成的二进制文件无法在鸿蒙上运行。

确保一致性:这保证了后续编译 openssl 或 curl 时,每一行编译命令都明确指向了鸿蒙的 ARM64 架构。

接下来又有新的报错:

bash 复制代码
DEBUG: APPLINKDIR = ms => APPLINKDIR = /root/vcpkg/buildtrees/openssl/arm64-ohos-rel/ms, APPLINKDIR_REL_PREFIX = ms
DEBUG: ENGINESDIR = engines => ENGINESDIR = /root/vcpkg/buildtrees/openssl/arm64-ohos-rel/engines, ENGINESDIR_REL_LIBDIR = engines
DEBUG: MODULESDIR = providers => MODULESDIR = /root/vcpkg/buildtrees/openssl/arm64-ohos-rel/providers, MODULESDIR_REL_LIBDIR = providers
DEBUG: PKGCONFIGDIR = . => PKGCONFIGDIR = /root/vcpkg/buildtrees/openssl/arm64-ohos-rel, PKGCONFIGDIR_REL_LIBDIR = .
DEBUG: CMAKECONFIGDIR = . => CMAKECONFIGDIR = /root/vcpkg/buildtrees/openssl/arm64-ohos-rel, CMAKECONFIGDIR_REL_LIBDIR = .
Use of uninitialized value in join or string at ../src/nssl-3.6.1-444317d7e5.clean/util/mkinstallvars.pl line 156.
../src/nssl-3.6.1-444317d7e5.clean/crypto/bn/asm/x86_64-gcc.c:123:9: error: invalid output constraint '=a' in asm
        mul_add(rp[0], ap[0], w, c1);
        ^
../src/nssl-3.6.1-444317d7e5.clean/crypto/bn/asm/x86_64-gcc.c:80:15: note: expanded from macro 'mul_add'
            : "=a"(low), "=d"(high)   \
              ^
../src/nssl-3.6.1-444317d7e5.clean/crypto/bn/asm/x86_64-gcc.c:123:9: error: invalid output constraint '+d' in asm
../src/nssl-3.6.1-444317d7e5.clean/crypto/bn/asm/x86_64-gcc.c:84:28: note: expanded from macro 'mul_add'
            : "+r"(carry), "+d"(high) \

从日志上看,竟然编译了针对x64平台的特定优化代码。

继续修改openssl的portfile.cmake文件:

bash 复制代码
elseif(VCPKG_TARGET_IS_OHOS)  # 新增这一段,支持OHOS平台
      vcpkg_list(APPEND CONFIGURE_OPTIONS
        no-asm          # 核心修复:禁止汇编优化,避免x86指令冲突
        no-sse2         # 核心修复:禁止x86指令集
        no-engine       # 减小体积,减少环境依赖
        no-tests        # 跳过测试,节省编译时间
        no-srtp         # 除非需要音视频加密,否则禁用
      )
      vcpkg_cmake_get_vars(cmake_vars_file)
      include("${cmake_vars_file}")
      string(APPEND VCPKG_C_FLAGS " --target=${VCPKG_DETECTED_CMAKE_C_COMPILER_TARGET}")
      string(APPEND VCPKG_CXX_FLAGS " --target=${VCPKG_DETECTED_CMAKE_CXX_COMPILER_TARGET}")
      set(OPENSSL_TARGET_PLATFORM "linux-aarch64")
else()
    message(FATAL_ERROR "Unknown platform")
endif()

最终下载安装成功:

真机上验证

使用前面介绍的vcpkg,配置好环境后直接下载安装 curl进行测试

bash 复制代码
export OHOS_SDK_ROOT=/root/ohos-sdk/linux/
#./vcpkg install curl[core,tool]:arm64-ohos --recurse
./vcpkg install curl[core,tool]:arm64-ohos 

可以看出使用vcpkg后,安装三方库或命令行工具变得如此简单啦!

上述命令将自动构建出curl及其相关的依赖库(openssl) libz.solibssl.solibcrypto.so和libz.so

将相关的依赖库也放到鸿蒙PC上。

注意 :别忘了使用binary-sign-tool工具对可执行文件和依赖库文件进行签名。否则会报错,提示 zsh: operation not permitted

可以使用以下命令查看是否已签名:

bash 复制代码
/root/ohos-sdk/linux/native/llvm/bin/llvm-readelf -S libcurl.so
bash 复制代码
cd test
export LD_LIBRARY_PATH=$(pwd)
binary-sign-tool sign -inFile libz.so -outFile libz.so -selfSign "1"
binary-sign-tool sign -inFile libcrypto.so.3 -outFile libcrypto.so.3 -selfSign "1"
binary-sign-tool sign -inFile libssl.so.3 -outFile libssl.so.3 -selfSign "1"
binary-sign-tool sign -inFile curl -outFile curl -selfSign "1"
binary-sign-tool sign -inFile libcurl.so -outFile libcurl.so -selfSign "1"
#增加可执行权限
chmod +x curl
#运行curl
./curl --help

13. 小结与建议

  • vcpkg 把 C/C++ 原生依赖的安装与交叉编译流程 标准化,特别适合三方库多、且不想维护一堆手工脚本的团队。
  • OHOS SDK + CMake + Ninja 的前提下,通过 带 OHOS 支持的 vcpkg fork ,可以把依赖安装从"人肉维护"推进到 可重复执行的基础设施
  • 落地建议:固定 triplet固定 SDK 路径与 API 级别 、在 CI 中 缓存 installed 或启用二进制缓存 、对关键库做 链接与运行期加载 的回归。

将 HarmonyOS 支持添加到 vcpkg ,消除了目前每个 OHOS C/C++ 开发人员面临的每个库单独进行交叉编译的负担。开发人员无需为每个依赖项维护自定义构建脚本,构建配方都保存在一个由社区维护的仓库中。

如果你正在为 HarmonyOS 构建原生库,欢迎尝试使用vcpkg的支持 HarmonyOS 的分支版本,大幅简化了三方库的移植负担。


14. 参考文献与链接

  1. Qt 官方博文 :Jörg Bornemann,Building C/C++ libraries for HarmonyOS with vcpkg (2026-04-10)--- https://www.qt.io/blog/building-libraries-for-harmonyos-with-vcpkg
  2. Qt 官方 vcpkg(registry)https://git.qt.io/jobor/vcpkg
  3. Qt 官方 vcpkg-toolhttps://git.qt.io/jobor/vcpkg-tool
  4. GitCode 上的 vcpkg 镜像(个人同步,clone 通常更快)https://gitcode.com/qq8864/vcpkg
  5. 微软上游 vcpkg(通用文档与生态入口;OHOS 是否已合入以仓库说明为准)https://github.com/microsoft/vcpkg

最后,欢迎加入开源鸿蒙开发者社区交流:https://harmonypc.csdn.net/

相关推荐
音视频牛哥2 小时前
HarmonyOS NEXT系统RTSP、RTMP超低延迟直播播放器全面解析
华为·harmonyos·鸿蒙rtmp播放器·鸿蒙rtsp播放器·纯血鸿蒙rtsp播放器·harmonyos rtsp·harmonyos rtmp
音视频牛哥2 小时前
国产化浪潮下,鸿蒙NEXT低延迟RTSP|RTMP直播播放器的破局之路
harmonyos·大牛直播sdk·鸿蒙rtmp播放器·鸿蒙rtsp播放器·鸿蒙next rtsp播放器·鸿蒙next rtmp播放器·纯血鸿蒙rtsp播放器
键盘鼓手苏苏2 小时前
Flutter 三方库 persistent_cache_simple 的鸿蒙化适配指南 - 实现具备磁盘溢出淘汰与极简 API 的本地持久化缓存、支持端侧资源异步落地与状态秒开实战
flutter·缓存·harmonyos
互联网散修3 小时前
零基础鸿蒙应用开发第三十三节:正则表达式基础与应用
华为·正则表达式·harmonyos
SoraLuna3 小时前
「鸿蒙智能体实战记录 16」禅心(Zen Heart):极简表达与留白控制
华为·harmonyos
小兔崽子去哪了3 小时前
华为 IODT 设备接入
java·华为
梁山好汉(Ls_man)3 小时前
鸿蒙_使用DevEco Studio预览器
华为·harmonyos·arkui·预览器
互联网散修4 小时前
鸿蒙跨设备实时绘图同步:从零到一实现分布式画板
分布式·wpf·harmonyos
HMS Core5 小时前
化繁为简:顺丰速运App如何通过 HarmonyOS SDK实现专业级空间测量
华为·harmonyos