终于可以在鸿蒙PC电脑上直接使用vcpkg啦。用到的三方库可以直接在鸿蒙PC上使用vcpkg命令安装。在鸿蒙PC上使用之前需要先把vcpkg这个可执行命令行程序移植上去。本文记录使用OHOS SDK CMake Ninja在Ubuntu24.04的linux宿主机环境上 ,交叉编译vcpkg-tool生成可在鸿蒙 PC 上运行的vcpkg可执行文件的全过程包括依赖约定、典型报错与处理方式以及在设备侧运行时与dlopen / 签名 / libcurl相关的注意事项。vcpkg在鸿蒙PC上使用效果截图移植成功的鸿蒙PC上的vcpkg项目地址*https://gitcode.com/qq8864/vcpkg-tool.git找到ohos-pc分支里面有编译好的在鸿蒙PC上可运行的vcpkg可执行文件,将其拷贝到鸿蒙PC上即可运行。如何真机验证和使用1.在鸿蒙PC上clone以下仓库地址gitclone https://gitcode.com/OpenHarmonyPCDeveloper/ohos_vcpkg.git将构建生成的可在鸿蒙pc上运行的vcpkg可执行文件放进上面clone下来的ohos_vcpkg里。将依赖的鸿蒙PC平台上的so库libcurl.so.4、libssl.so.3、 libcrypto.so.3、libz.so也放进来。2.运行cdohos_vcpkgLD_LIBRARY_PATH$(pwd)./vcpkg--version预期可见版本信息例如vcpkg package management program version 2999-12-31-unknownhash接下来介绍下vcpkg-tool 交叉编译的详细过程1. 环境与目标项目说明目标三元组 / 架构aarch64-linux-ohosSDKOHOS SDK示例路径见下CMake≥ 3.28示例4.1.2Ninja示例1.12.1生成系统Ninja典型宿主机Ubuntu 24.04x86_64交叉编译目标为 aarch64 OHOS真机验证环境鸿蒙PCarm64-v8a宿主机 | Ubuntu 24.04x86_64环境下SDK安装及下载1.0 环境准备Ubuntu 24.04_x86_64 宿主机环境sudoaptupdatesudoaptinstall-ygitcurlcmake ninja-build gcc gmakeautoconf automake libtool yasm nasmsudoaptinstall-ygettext autopointsudoaptinstallpython3 python3-pipsudoupdate-alternatives--install/usr/bin/python python /usr/bin/python311.1下载配置ohos-sdksdk_download_urlhttps://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.gzcurl-oohos-sdk-public.tar.gz$sdk_download_urlmkdirohos-sdktar-zxfohos-sdk-public.tar.gz-Cohos-sdkcd~/ohos-sdk/linuxunzipnative-linux-x64-6.1.0.27-Beta1.zipunziptoolchains-linux-x64-6.1.0.27-Beta1.zip这段代码的作用是从指定的 URL 下载 SDK 压缩包然后创建一个名为ohos-sdk的目录并将压缩包解压到该目录下。SDK 目录示例以$OHOS_SDK_ROOT/linux/native/为前缀/root/ohos-sdk/linux/native/ ├── build-tools/ ├── llvm/ # clang、lld、ar 等 ├── sysroot/ # 头文件与系统库 └── toolchain.cmake # 或 ohos.toolchain.cmake依 SDK 版本而定设置环境变量exportOHOS_SDK_ROOT/root/ohos-sdk/linux2. 前置依赖在配置工程前确认 SDK 自带的构建工具可用$OHOS_SDK_ROOT/native/build-tools/cmake/bin/cmake--version$OHOS_SDK_ROOT/native/build-tools/cmake/bin/ninja--version注意还需要已在同一 OHOS triplet下通过 vcpkg或其它方式准备好curl、fmt、nlohmann-json等鸿蒙PC上的so库外部依赖的安装前缀下文 CMake 变量中的路径需要用到。若在大陆网络环境构建FetchContent/ GitHub 直连失败时需准备代理或离线包见第 5 节。关于这部分内容可以参考博文使用 vcpkg 为鸿蒙HarmonyOS / OHOS下载与安装三方库实践指南简单来说就是需要先搞个在linux或windows上能用的vcpkg环境用来安装鸿蒙pc上的三方库。因为vcpkg可执行文件依赖了curl和openssl等鸿蒙pc上的so库。如下所示1.安装依赖fmt./vcpkginstallfmt:arm64-ohos2.安装libcurl和json库# 安装鸿蒙pc上的libcurl的so库./vcpkginstalllibcurl:arm64-ohos# 安装鸿蒙pc上的nlohmann-jsonso库./vcpkginstallnlohmann-json:arm64-ohos3. 构建思路简述使用OHOS 的 CMake toolchain指向 Clang 与 sysroot。将curl、nlohmann-json作为外部 CMake 包接入DVCPKG_DEPENDENCY_EXTERNAL_*避免使用 vcpkg-tool 内置抓取的头文件与宿主不匹配。fmt建议走内置静态依赖外部 fmt 主版本与 vcpkg-tool 源码期望fmt v11 /fmt::v11不一致时会出现模板符号歧义见第 6 节。对curl/curlbuild.h一类交叉编译宏冲突通过额外 include 路径指向你用 OHOS 工具链编好的 curl 头文件。4. 问题一libcurl头文件 /curlbuild.h报错4.1 典型报错摘录In file included from include/vcpkg/base/curl.h:14: build/_deps/libcurlheaders-src/include/curl/curlbuild.h:122:4: error: CURL_SIZEOF_CURL_SOCKLEN_T shall not be defined except in curlbuild.h build/_deps/libcurlheaders-src/include/curl/curlrules.h:79:4: error: CURL_SIZEOF_LONG definition is missing!4.2 原因说明简述vcpkg-tool 会FetchContent一套用于编译期的 curl头文件树该树里的curlbuild.h与当前交叉目标OHOS / aarch64的长整数、socklen_t等尺寸假定不一致时会触发curlrules.h的静态断言。4.3 处理办法改为使用已为 OHOS 编好的 curl 安装树中的头文件并通过编译选项把该 include 目录放到搜索路径最前示例路径请替换为你的包路径-DCMAKE_CXX_FLAGS-I/root/ohos_vcpkg/packages/curl_arm64-ohos/include同时配合「外部 curl CMake 包」开关见第 7 节完整 CMake 命令。5. 问题二CMake 拉取 GitHub / FetchContent 失败5.1 现象配置阶段在下载cmrc、libcurlheaders等依赖 tarball 时超时或 TLS 失败。5.2 方法一代理推荐exporthttp_proxyhttp://代理主机:端口exporthttps_proxyhttp://代理主机:端口# 重新执行 cmake 配置命令5.3 方法二离线放置源码包「欺骗」下载步骤在可访问 GitHub 的机器上下载对应版本例如https://github.com/vector-of-bool/cmrc/archive/refs/tags/2.0.1.tar.gz上传到构建机后放入 CMakeFetchContent期望的populate 源码目录路径需与你的build/_deps/...实际一致例如mkdir-p/root/vcpkg-tool/build/_deps/cmakerc-subbuild/cmakerc-populate-prefix/src/cp2.0.1.tar.gz /root/vcpkg-tool/build/_deps/cmakerc-subbuild/cmakerc-populate-prefix/src/mkdir-p/root/vcpkg-tool/build/_deps/libcurlheaders-subbuild/libcurlheaders-populate-prefix/src/cpcurl-7.29.0.tar.gz /root/vcpkg-tool/build/_deps/libcurlheaders-subbuild/libcurlheaders-populate-prefix/src/保留build目录后再次运行同一套cmake命令若哈希与大小校验策略允许常会跳过重新下载。5.4 方法三改镜像 URL若允许修改 vcpkg-tool 仓库内的CMakeLists.txt/cmake/中的FetchContentURL可替换为国内镜像或自建制品地址注意版本与校验和一致性。6. 问题三fmt版本不一致导致编译歧义6.1 典型报错特征编译错误中出现fmt::v11与fmt::v12或其它主版本并存、formatterambiguous等描述。6.2 根因vcpkg-tool 当前源码按fmt v11API 编写若DVCPKG_DEPENDENCY_EXTERNAL_FMTON且提供的 fmt过新例如 v12会出现命名空间与模板实例歧义。这个报错的原因是 fmt 库的版本冲突导致的。报错根本原因版本不匹配vcpkg-tool 的源代码尤其是 stringview.h 和 fmt.h是基于 fmt v11 编写的代码中期望找到 fmt::v11。符号冲突你手动编译并提供的外部 fmt 库版本太新了从错误日志看是 v12即 fmt::v12::formatter。歧义当编译器遇到 fmt::formatter 时它同时发现了 v11代码声明和 v12你提供的库导致 reference to ‘formatter’ is ambiguous引用歧义。6.3 推荐做法-DVCPKG_DEPENDENCY_EXTERNAL_FMTOFF让工程内置获取并静态链接与源码匹配的 fmt避免与外部包版本打架。外部 curl / nlohmann-json 仍可保持ON。关闭它让它自己下载并编译链接使用内部的静态库。7. 问题四构建成功后在鸿蒙 PC 上运行找不到libcurl7.1 现象可执行文件启动即退出提示类似vcpkg was unable to find a libcurl.so.4, libcurl-gnutls.so.4, or libcurl-nss.so.4 to use on this system.即便已将目录加入LD_LIBRARY_PATH仍可能失败。7.2 原因概要vcpkg-tool不在链接期硬链接 libcurl而是在运行时用dlopen(libcurl.so.4, ...)加载参见源码src/vcpkg/base/curl.cpp。鸿蒙侧对加载进进程的 ELF 共享库往往有签名校验要求未签名的libcurl.so/ 其传递依赖可能在策略上无法被成功dlopen。libcurl.so.4与 SONAME部分构建产物SONAME为libcurl.so但dlopen 按文件名查找libcurl.so.4部署时需保证查找路径下存在期望文件名必要时同时保留符号链接或拷贝。7.3 依赖链自检readelf-dbuild/libcurl.so|grep-ESONAME|NEEDED示例输出示意0x0000000000000001 (NEEDED) Shared library: [libssl.so.3] 0x0000000000000001 (NEEDED) Shared library: [libcrypto.so.3] 0x0000000000000001 (NEEDED) Shared library: [libz.so] 0x0000000000000001 (NEEDED) Shared library: [libc.so] 0x000000000000000e (SONAME) Library soname: [libcurl.so]结论libcurl、openssl、zlib等在运行路径中不仅要「找得到」在鸿蒙 PC 上通常还需要满足签名 / 安全策略。7.4 签名与运行示例在鸿蒙环境使用binary-sign-tool对.so签名路径与参数以你的 SDK / 系统文档为准cdbuild binary-sign-tool sign-inFilelibcurl.so-outFilelibcurl.so-selfSign1binary-sign-tool sign-inFilelibcurl.so.4-outFilelibcurl.so.4-selfSign1binary-sign-tool sign-inFilelibssl.so.3-outFilelibssl.so.3-selfSign1binary-sign-tool sign-inFilelibcrypto.so.3-outFilelibcrypto.so.3-selfSign1binary-sign-tool sign-inFilelibz.so-outFilelibz.so-selfSign1||true批量示例cdbuildforlibinlibcurl.so libcurl.so.4 libssl.so.3 libcrypto.so.3;dobinary-sign-tool sign-inFile$lib-outFile$lib-selfSign1donebinary-sign-tool sign-inFilelibz.so-outFilelibz.so-selfSign1||true运行cdbuildLD_LIBRARY_PATH$(pwd)./vcpkg--version预期可见版本信息例如vcpkg package management program version 2999-12-31-unknownhash便捷脚本示例run-vcpkg.sh#!/bin/shcd$(dirname$0)/buildexportLD_LIBRARY_PATH$(pwd)exec./vcpkg$7.5 已知限制说明binary-sign-tool对部分较小或非典型 ELF 文件可能报FILE_NOT_FOUND等误报业界反馈中libz.so偶发一般不影响文件完整性核心libcurl/libssl/libcrypto签名成功即可优先验证主流程。对vcpkg主程序本身的签名若失败多数场景下不影响「只要能加载依赖.so」的运行路径验证。8. 完整 CMake 配置示例全新构建以下为一组「可用作起点」的命令请将所有/root/...路径替换为你的 OHOS SDK、vcpkg 安装前缀与依赖包路径。##进入vcpkg-tool目录cd~/vcpkg-tool/#设置环境变量exportOHOS_SDK_ROOT/root/ohos-sdk/linux# 执行脚本cmake-S.-Bbuild-GNinja\-DCMAKE_BUILD_TYPERelease\-DBUILD_TESTINGOFF\-DCMAKE_TOOLCHAIN_FILE$OHOS_SDK_ROOT/native/build/cmake/ohos.toolchain.cmake\-DCMAKE_INSTALL_PREFIXbuild/install\-DVCPKG_DEPENDENCY_EXTERNAL_FMTOFF\-DVCPKG_DEPENDENCY_EXTERNAL_CURLON\-DVCPKG_DEPENDENCY_EXTERNAL_NLOHMANN_JSONON\-Dfmt_DIR/root/ohos_vcpkg/packages/fmt_arm64-ohos/share/fmt\-Dcurl_DIR/root/ohos_vcpkg/packages/curl_arm64-ohos/share/curl\-Dnlohmann_json_DIR/root/ohos_vcpkg/packages/nlohmann-json_arm64-ohos/share/nlohmann_json\-DCMAKE_CXX_FLAGS-I/root/ohos_vcpkg/packages/curl_arm64-ohos/includecmake--buildbuild增量重建ninja-Cbuild清理ninja-Cbuild-tclean# 或彻底删除 build/rm-rfbuild在鸿蒙PC上执行拷贝vcpkg可执行文件和依赖的库放到鸿蒙PC上例如下面的build目录作为测试# 鸿蒙 PC 运行前对依赖 .so 签名见第 7 节cdbuildforlibinlibcurl.so libcurl.so.4 libssl.so.3 libcrypto.so.3;dobinary-sign-tool sign-inFile$lib-outFile$lib-selfSign1doneLD_LIBRARY_PATH$(pwd)./vcpkg--version9. 常见问题 FAQQ1clang: warning: argument unused during compilation: --gcc-toolchain...多为 OHOS Clang 识别了--gcc-toolchain但在当前链接模型下未使用所致一般可忽略。如需静默可加-Wno-unused-command-line-argument或在 toolchain 中精简该参数的传递视 SDK 版本而定。Q2明明存在libcurl.so.4仍提示找不到用readelf -S等工具确认是否已有鸿蒙 codesign /.ohos.codesign相关段具体命令以你环境文档为准。确认libssl.so.3、libcrypto.so.3、libz.so等同路径可得且策略允许加载。LD_LIBRARY_PATH是否覆盖实际放置.so的目录文件名是否与dlopen期望一致。Q3在鸿蒙 PC 上没有图形界面如何低成本验证可在 x86_64 Linux 上通过容器模拟鸿蒙 PC 运行环境社区有不少基于 Docker 的搭建文章可参考例如低成本搭建鸿蒙 PC 运行环境基于 Docker 的 x86_64 服务器CSDN鸿蒙PC真机上运行别忘记了签名了。按顺序执行以下操作#1. clone vcpkg_ohos仓gitclone https://gitcode.com/OpenHarmonyPCDeveloper/ohos_vcpkg.git#2. 进入到ohos_vcpkg目录cdohos_vcpkg#3. 将vcpkg和libcurl.so等文件放入ohos_vcpkg目录中#4. 签名binary-sign-tool sign-inFilevcpkg-outFilevcpkg-selfSign1#5. 给可执行权限chmodxvcpkg#6. 设置环境变量OHOS_SDK_ROOTexportOHOS_SDK_ROOT/data/service/hnp/ohos-sdk.org/ohos-sdk_26.0.0.18/ohos#7. 设置下LD_LIBRARY_PATH 让可以找到依赖的so库(libcurl.so等)exportLD_LIBRARY_PATH$(pwd)#8. 一切就绪执行下vcpkg --version./vcpkg--version安装个三方库zlib试试./vcpkginstallzlib:arm64-ohos安装成功注意上面报的zip命令不支持这个无影响。这个是配置二进制缓存用的。这个操作是使用zip命令打包为二进制缓存方便跨机器共享加快构建速度用途。但目前鸿蒙pc上无zip命令。安装成功后库的位置附录产物自检命令fileohos_vcpkg/vcpkg# 示例ELF 64-bit LSB executable, ARM aarch64, ...readelf-dohos_vcpkg/vcpkg|grepNEEDED readelf-nohos_vcpkg/vcpkg|grepBuild IDreadelf-Sohos_vcpkg/libcurl.so.4|grep-icodesign readelf-dohos_vcpkg/libcurl.so|grep-ESONAME|NEEDEDLD_LIBRARY_PATHohos_vcpkg ohos_vcpkg/vcpkg--version结语将vcpkg-tool交叉编译到鸿蒙 PCaarch64 OHOS难点通常集中在三件事交叉编译下 curl 头文件与宏的一致性、FetchContent 的网络与离线兜底、以及运行时 libcurl 的 dlopen 系统级签名策略。按本文顺序逐项对齐后可在宿主机稳定产出 ELF并在鸿蒙 PC或容器模拟环境中完成vcpkg --version级别的冒烟验证。更多分享请访问猫哥的博客欢迎加入鸿蒙PC开发者社区共同打造开发者工具生态 鸿蒙PC开发者社区
移植 vcpkg 到鸿蒙 PC:vcpkg-tool 交叉编译与实践手记(鸿蒙 PC下的vcpkg使用)
发布时间:2026/5/25 11:36:08
终于可以在鸿蒙PC电脑上直接使用vcpkg啦。用到的三方库可以直接在鸿蒙PC上使用vcpkg命令安装。在鸿蒙PC上使用之前需要先把vcpkg这个可执行命令行程序移植上去。本文记录使用OHOS SDK CMake Ninja在Ubuntu24.04的linux宿主机环境上 ,交叉编译vcpkg-tool生成可在鸿蒙 PC 上运行的vcpkg可执行文件的全过程包括依赖约定、典型报错与处理方式以及在设备侧运行时与dlopen / 签名 / libcurl相关的注意事项。vcpkg在鸿蒙PC上使用效果截图移植成功的鸿蒙PC上的vcpkg项目地址*https://gitcode.com/qq8864/vcpkg-tool.git找到ohos-pc分支里面有编译好的在鸿蒙PC上可运行的vcpkg可执行文件,将其拷贝到鸿蒙PC上即可运行。如何真机验证和使用1.在鸿蒙PC上clone以下仓库地址gitclone https://gitcode.com/OpenHarmonyPCDeveloper/ohos_vcpkg.git将构建生成的可在鸿蒙pc上运行的vcpkg可执行文件放进上面clone下来的ohos_vcpkg里。将依赖的鸿蒙PC平台上的so库libcurl.so.4、libssl.so.3、 libcrypto.so.3、libz.so也放进来。2.运行cdohos_vcpkgLD_LIBRARY_PATH$(pwd)./vcpkg--version预期可见版本信息例如vcpkg package management program version 2999-12-31-unknownhash接下来介绍下vcpkg-tool 交叉编译的详细过程1. 环境与目标项目说明目标三元组 / 架构aarch64-linux-ohosSDKOHOS SDK示例路径见下CMake≥ 3.28示例4.1.2Ninja示例1.12.1生成系统Ninja典型宿主机Ubuntu 24.04x86_64交叉编译目标为 aarch64 OHOS真机验证环境鸿蒙PCarm64-v8a宿主机 | Ubuntu 24.04x86_64环境下SDK安装及下载1.0 环境准备Ubuntu 24.04_x86_64 宿主机环境sudoaptupdatesudoaptinstall-ygitcurlcmake ninja-build gcc gmakeautoconf automake libtool yasm nasmsudoaptinstall-ygettext autopointsudoaptinstallpython3 python3-pipsudoupdate-alternatives--install/usr/bin/python python /usr/bin/python311.1下载配置ohos-sdksdk_download_urlhttps://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.gzcurl-oohos-sdk-public.tar.gz$sdk_download_urlmkdirohos-sdktar-zxfohos-sdk-public.tar.gz-Cohos-sdkcd~/ohos-sdk/linuxunzipnative-linux-x64-6.1.0.27-Beta1.zipunziptoolchains-linux-x64-6.1.0.27-Beta1.zip这段代码的作用是从指定的 URL 下载 SDK 压缩包然后创建一个名为ohos-sdk的目录并将压缩包解压到该目录下。SDK 目录示例以$OHOS_SDK_ROOT/linux/native/为前缀/root/ohos-sdk/linux/native/ ├── build-tools/ ├── llvm/ # clang、lld、ar 等 ├── sysroot/ # 头文件与系统库 └── toolchain.cmake # 或 ohos.toolchain.cmake依 SDK 版本而定设置环境变量exportOHOS_SDK_ROOT/root/ohos-sdk/linux2. 前置依赖在配置工程前确认 SDK 自带的构建工具可用$OHOS_SDK_ROOT/native/build-tools/cmake/bin/cmake--version$OHOS_SDK_ROOT/native/build-tools/cmake/bin/ninja--version注意还需要已在同一 OHOS triplet下通过 vcpkg或其它方式准备好curl、fmt、nlohmann-json等鸿蒙PC上的so库外部依赖的安装前缀下文 CMake 变量中的路径需要用到。若在大陆网络环境构建FetchContent/ GitHub 直连失败时需准备代理或离线包见第 5 节。关于这部分内容可以参考博文使用 vcpkg 为鸿蒙HarmonyOS / OHOS下载与安装三方库实践指南简单来说就是需要先搞个在linux或windows上能用的vcpkg环境用来安装鸿蒙pc上的三方库。因为vcpkg可执行文件依赖了curl和openssl等鸿蒙pc上的so库。如下所示1.安装依赖fmt./vcpkginstallfmt:arm64-ohos2.安装libcurl和json库# 安装鸿蒙pc上的libcurl的so库./vcpkginstalllibcurl:arm64-ohos# 安装鸿蒙pc上的nlohmann-jsonso库./vcpkginstallnlohmann-json:arm64-ohos3. 构建思路简述使用OHOS 的 CMake toolchain指向 Clang 与 sysroot。将curl、nlohmann-json作为外部 CMake 包接入DVCPKG_DEPENDENCY_EXTERNAL_*避免使用 vcpkg-tool 内置抓取的头文件与宿主不匹配。fmt建议走内置静态依赖外部 fmt 主版本与 vcpkg-tool 源码期望fmt v11 /fmt::v11不一致时会出现模板符号歧义见第 6 节。对curl/curlbuild.h一类交叉编译宏冲突通过额外 include 路径指向你用 OHOS 工具链编好的 curl 头文件。4. 问题一libcurl头文件 /curlbuild.h报错4.1 典型报错摘录In file included from include/vcpkg/base/curl.h:14: build/_deps/libcurlheaders-src/include/curl/curlbuild.h:122:4: error: CURL_SIZEOF_CURL_SOCKLEN_T shall not be defined except in curlbuild.h build/_deps/libcurlheaders-src/include/curl/curlrules.h:79:4: error: CURL_SIZEOF_LONG definition is missing!4.2 原因说明简述vcpkg-tool 会FetchContent一套用于编译期的 curl头文件树该树里的curlbuild.h与当前交叉目标OHOS / aarch64的长整数、socklen_t等尺寸假定不一致时会触发curlrules.h的静态断言。4.3 处理办法改为使用已为 OHOS 编好的 curl 安装树中的头文件并通过编译选项把该 include 目录放到搜索路径最前示例路径请替换为你的包路径-DCMAKE_CXX_FLAGS-I/root/ohos_vcpkg/packages/curl_arm64-ohos/include同时配合「外部 curl CMake 包」开关见第 7 节完整 CMake 命令。5. 问题二CMake 拉取 GitHub / FetchContent 失败5.1 现象配置阶段在下载cmrc、libcurlheaders等依赖 tarball 时超时或 TLS 失败。5.2 方法一代理推荐exporthttp_proxyhttp://代理主机:端口exporthttps_proxyhttp://代理主机:端口# 重新执行 cmake 配置命令5.3 方法二离线放置源码包「欺骗」下载步骤在可访问 GitHub 的机器上下载对应版本例如https://github.com/vector-of-bool/cmrc/archive/refs/tags/2.0.1.tar.gz上传到构建机后放入 CMakeFetchContent期望的populate 源码目录路径需与你的build/_deps/...实际一致例如mkdir-p/root/vcpkg-tool/build/_deps/cmakerc-subbuild/cmakerc-populate-prefix/src/cp2.0.1.tar.gz /root/vcpkg-tool/build/_deps/cmakerc-subbuild/cmakerc-populate-prefix/src/mkdir-p/root/vcpkg-tool/build/_deps/libcurlheaders-subbuild/libcurlheaders-populate-prefix/src/cpcurl-7.29.0.tar.gz /root/vcpkg-tool/build/_deps/libcurlheaders-subbuild/libcurlheaders-populate-prefix/src/保留build目录后再次运行同一套cmake命令若哈希与大小校验策略允许常会跳过重新下载。5.4 方法三改镜像 URL若允许修改 vcpkg-tool 仓库内的CMakeLists.txt/cmake/中的FetchContentURL可替换为国内镜像或自建制品地址注意版本与校验和一致性。6. 问题三fmt版本不一致导致编译歧义6.1 典型报错特征编译错误中出现fmt::v11与fmt::v12或其它主版本并存、formatterambiguous等描述。6.2 根因vcpkg-tool 当前源码按fmt v11API 编写若DVCPKG_DEPENDENCY_EXTERNAL_FMTON且提供的 fmt过新例如 v12会出现命名空间与模板实例歧义。这个报错的原因是 fmt 库的版本冲突导致的。报错根本原因版本不匹配vcpkg-tool 的源代码尤其是 stringview.h 和 fmt.h是基于 fmt v11 编写的代码中期望找到 fmt::v11。符号冲突你手动编译并提供的外部 fmt 库版本太新了从错误日志看是 v12即 fmt::v12::formatter。歧义当编译器遇到 fmt::formatter 时它同时发现了 v11代码声明和 v12你提供的库导致 reference to ‘formatter’ is ambiguous引用歧义。6.3 推荐做法-DVCPKG_DEPENDENCY_EXTERNAL_FMTOFF让工程内置获取并静态链接与源码匹配的 fmt避免与外部包版本打架。外部 curl / nlohmann-json 仍可保持ON。关闭它让它自己下载并编译链接使用内部的静态库。7. 问题四构建成功后在鸿蒙 PC 上运行找不到libcurl7.1 现象可执行文件启动即退出提示类似vcpkg was unable to find a libcurl.so.4, libcurl-gnutls.so.4, or libcurl-nss.so.4 to use on this system.即便已将目录加入LD_LIBRARY_PATH仍可能失败。7.2 原因概要vcpkg-tool不在链接期硬链接 libcurl而是在运行时用dlopen(libcurl.so.4, ...)加载参见源码src/vcpkg/base/curl.cpp。鸿蒙侧对加载进进程的 ELF 共享库往往有签名校验要求未签名的libcurl.so/ 其传递依赖可能在策略上无法被成功dlopen。libcurl.so.4与 SONAME部分构建产物SONAME为libcurl.so但dlopen 按文件名查找libcurl.so.4部署时需保证查找路径下存在期望文件名必要时同时保留符号链接或拷贝。7.3 依赖链自检readelf-dbuild/libcurl.so|grep-ESONAME|NEEDED示例输出示意0x0000000000000001 (NEEDED) Shared library: [libssl.so.3] 0x0000000000000001 (NEEDED) Shared library: [libcrypto.so.3] 0x0000000000000001 (NEEDED) Shared library: [libz.so] 0x0000000000000001 (NEEDED) Shared library: [libc.so] 0x000000000000000e (SONAME) Library soname: [libcurl.so]结论libcurl、openssl、zlib等在运行路径中不仅要「找得到」在鸿蒙 PC 上通常还需要满足签名 / 安全策略。7.4 签名与运行示例在鸿蒙环境使用binary-sign-tool对.so签名路径与参数以你的 SDK / 系统文档为准cdbuild binary-sign-tool sign-inFilelibcurl.so-outFilelibcurl.so-selfSign1binary-sign-tool sign-inFilelibcurl.so.4-outFilelibcurl.so.4-selfSign1binary-sign-tool sign-inFilelibssl.so.3-outFilelibssl.so.3-selfSign1binary-sign-tool sign-inFilelibcrypto.so.3-outFilelibcrypto.so.3-selfSign1binary-sign-tool sign-inFilelibz.so-outFilelibz.so-selfSign1||true批量示例cdbuildforlibinlibcurl.so libcurl.so.4 libssl.so.3 libcrypto.so.3;dobinary-sign-tool sign-inFile$lib-outFile$lib-selfSign1donebinary-sign-tool sign-inFilelibz.so-outFilelibz.so-selfSign1||true运行cdbuildLD_LIBRARY_PATH$(pwd)./vcpkg--version预期可见版本信息例如vcpkg package management program version 2999-12-31-unknownhash便捷脚本示例run-vcpkg.sh#!/bin/shcd$(dirname$0)/buildexportLD_LIBRARY_PATH$(pwd)exec./vcpkg$7.5 已知限制说明binary-sign-tool对部分较小或非典型 ELF 文件可能报FILE_NOT_FOUND等误报业界反馈中libz.so偶发一般不影响文件完整性核心libcurl/libssl/libcrypto签名成功即可优先验证主流程。对vcpkg主程序本身的签名若失败多数场景下不影响「只要能加载依赖.so」的运行路径验证。8. 完整 CMake 配置示例全新构建以下为一组「可用作起点」的命令请将所有/root/...路径替换为你的 OHOS SDK、vcpkg 安装前缀与依赖包路径。##进入vcpkg-tool目录cd~/vcpkg-tool/#设置环境变量exportOHOS_SDK_ROOT/root/ohos-sdk/linux# 执行脚本cmake-S.-Bbuild-GNinja\-DCMAKE_BUILD_TYPERelease\-DBUILD_TESTINGOFF\-DCMAKE_TOOLCHAIN_FILE$OHOS_SDK_ROOT/native/build/cmake/ohos.toolchain.cmake\-DCMAKE_INSTALL_PREFIXbuild/install\-DVCPKG_DEPENDENCY_EXTERNAL_FMTOFF\-DVCPKG_DEPENDENCY_EXTERNAL_CURLON\-DVCPKG_DEPENDENCY_EXTERNAL_NLOHMANN_JSONON\-Dfmt_DIR/root/ohos_vcpkg/packages/fmt_arm64-ohos/share/fmt\-Dcurl_DIR/root/ohos_vcpkg/packages/curl_arm64-ohos/share/curl\-Dnlohmann_json_DIR/root/ohos_vcpkg/packages/nlohmann-json_arm64-ohos/share/nlohmann_json\-DCMAKE_CXX_FLAGS-I/root/ohos_vcpkg/packages/curl_arm64-ohos/includecmake--buildbuild增量重建ninja-Cbuild清理ninja-Cbuild-tclean# 或彻底删除 build/rm-rfbuild在鸿蒙PC上执行拷贝vcpkg可执行文件和依赖的库放到鸿蒙PC上例如下面的build目录作为测试# 鸿蒙 PC 运行前对依赖 .so 签名见第 7 节cdbuildforlibinlibcurl.so libcurl.so.4 libssl.so.3 libcrypto.so.3;dobinary-sign-tool sign-inFile$lib-outFile$lib-selfSign1doneLD_LIBRARY_PATH$(pwd)./vcpkg--version9. 常见问题 FAQQ1clang: warning: argument unused during compilation: --gcc-toolchain...多为 OHOS Clang 识别了--gcc-toolchain但在当前链接模型下未使用所致一般可忽略。如需静默可加-Wno-unused-command-line-argument或在 toolchain 中精简该参数的传递视 SDK 版本而定。Q2明明存在libcurl.so.4仍提示找不到用readelf -S等工具确认是否已有鸿蒙 codesign /.ohos.codesign相关段具体命令以你环境文档为准。确认libssl.so.3、libcrypto.so.3、libz.so等同路径可得且策略允许加载。LD_LIBRARY_PATH是否覆盖实际放置.so的目录文件名是否与dlopen期望一致。Q3在鸿蒙 PC 上没有图形界面如何低成本验证可在 x86_64 Linux 上通过容器模拟鸿蒙 PC 运行环境社区有不少基于 Docker 的搭建文章可参考例如低成本搭建鸿蒙 PC 运行环境基于 Docker 的 x86_64 服务器CSDN鸿蒙PC真机上运行别忘记了签名了。按顺序执行以下操作#1. clone vcpkg_ohos仓gitclone https://gitcode.com/OpenHarmonyPCDeveloper/ohos_vcpkg.git#2. 进入到ohos_vcpkg目录cdohos_vcpkg#3. 将vcpkg和libcurl.so等文件放入ohos_vcpkg目录中#4. 签名binary-sign-tool sign-inFilevcpkg-outFilevcpkg-selfSign1#5. 给可执行权限chmodxvcpkg#6. 设置环境变量OHOS_SDK_ROOTexportOHOS_SDK_ROOT/data/service/hnp/ohos-sdk.org/ohos-sdk_26.0.0.18/ohos#7. 设置下LD_LIBRARY_PATH 让可以找到依赖的so库(libcurl.so等)exportLD_LIBRARY_PATH$(pwd)#8. 一切就绪执行下vcpkg --version./vcpkg--version安装个三方库zlib试试./vcpkginstallzlib:arm64-ohos安装成功注意上面报的zip命令不支持这个无影响。这个是配置二进制缓存用的。这个操作是使用zip命令打包为二进制缓存方便跨机器共享加快构建速度用途。但目前鸿蒙pc上无zip命令。安装成功后库的位置附录产物自检命令fileohos_vcpkg/vcpkg# 示例ELF 64-bit LSB executable, ARM aarch64, ...readelf-dohos_vcpkg/vcpkg|grepNEEDED readelf-nohos_vcpkg/vcpkg|grepBuild IDreadelf-Sohos_vcpkg/libcurl.so.4|grep-icodesign readelf-dohos_vcpkg/libcurl.so|grep-ESONAME|NEEDEDLD_LIBRARY_PATHohos_vcpkg ohos_vcpkg/vcpkg--version结语将vcpkg-tool交叉编译到鸿蒙 PCaarch64 OHOS难点通常集中在三件事交叉编译下 curl 头文件与宏的一致性、FetchContent 的网络与离线兜底、以及运行时 libcurl 的 dlopen 系统级签名策略。按本文顺序逐项对齐后可在宿主机稳定产出 ELF并在鸿蒙 PC或容器模拟环境中完成vcpkg --version级别的冒烟验证。更多分享请访问猫哥的博客欢迎加入鸿蒙PC开发者社区共同打造开发者工具生态 鸿蒙PC开发者社区