本文记录了使用
vcpkg中crashpad移植到arm64-ohos的完整过程。 其中报错不断,出现各种问题。不过最终都一一解决了,这里记录下来。目标是让后续同类移植工作可以少走弯路,遇到类似报错时能快速定位。
将 Crashpad 移植到 OpenHarmony(OHOS)并不是简单的"代码拷贝",整体难度属于中等偏上 。
它的挑战主要来自三件事:底层系统调用适配、平台构建规则对齐、沙盒运行环境约束。
从依赖数量看,Crashpad 不算"重",但依赖都很"硬",且源码需要通过修改portfile.cmake设置代理才能下载得到:
mini_chromium:Crashpad 的核心基础设施,移植 Crashpad 本质上先要打通 mini_chromium 的平台层LSS(Linux Syscall Support):在崩溃瞬间绕过 libc 直接发起系统调用,强依赖体系结构与 OS ABI 细节zlib:用于 dump 压缩,技术复杂度不高但必须正确接入GN + Clang工具链:构建链路强绑定,参数错位会直接导致编译或链接失败
移植过程里最常见的三大难点是:
- 系统判定与 GN 标志位 :Crashpad/mini_chromium 构建脚本大量使用
is_linux、is_android、is_fuchsia;OHOS 需要在逻辑上"接近 Linux",但又要避开不兼容路径 - LSS 与系统调用兼容:一旦 syscall 号、信号处理行为或汇编约束与预期不一致,就会在编译或运行阶段暴露硬错误
- 沙盒运行与路径限制 :
crashpad_handler拉起、IPC 建连、dump 落盘路径权限都受鸿蒙沙盒策略约束
这也是为什么通过 vcpkg 移植会显得"坎坷":默认 port 主要面向 Windows/Linux,OHOS 需要额外补齐 target_os、交叉编译参数、三方依赖拉取条件与局部源码兼容。
已验证结果(关键日志):
Generating build (arm64-ohos-rel)...Building (arm64-ohos-rel)...Installing: .../lib/libvcpkg_crashpad_client.aInstalling: .../tools/crashpad_handlerAll requested installations completed successfully

一、环境与前提
1) 关键环境变量
bash
export OHOS_SDK_ROOT=/root/ohos-sdk/linux/
并确认工具链存在:
bash
ls /root/ohos-sdk/linux/native/llvm/bin/clang++
OHOS的vcpkg,参考博文:使用 vcpkg 为鸿蒙(HarmonyOS / OHOS)下载与安装三方库实践指南
2) 目标平台
triplet:arm64-ohos- 编译器目标:
aarch64-linux-ohos sysroot:$OHOS_SDK_ROOT/native/sysroot
二、问题与修复总览
本次排障大致经历了以下阶段:
- 找不到 clang++
- GN 配置中未定义标识符(
common_flags/cflags) - C++ 标准不匹配(C++17 vs C++20)
- OHOS libc++ 对部分 ranges 能力不完整
- 链接缺符号(OHOS GN 路径不完整)
- 缺少 third_party/lss
- 系统头宏触发
-Wsign-compare且被-Werror升级
最终全部收敛并编译通过。
三、核心修改点(ports/crashpad/portfile.cmake)
核心修改内容:
bash
if(VCPKG_TARGET_IS_OHOS)
# Crashpad's GN rules don't fully model OHOS yet.
# Use the Linux target graph, but compile/link with OHOS toolchain + sysroot.
string(APPEND OPTIONS " target_os=\"linux\"")
# Load toolchain metadata exported by vcpkg.
vcpkg_cmake_get_vars(cmake_vars_file)
include("${cmake_vars_file}")
if(NOT DEFINED ENV{OHOS_SDK_ROOT})
message(FATAL_ERROR "Please set environment variable OHOS_SDK_ROOT")
endif()
set(OHOS_NATIVE_DIR "$ENV{OHOS_SDK_ROOT}/native")
set(OHOS_LLVM_BIN "${OHOS_NATIVE_DIR}/llvm/bin")
set(OHOS_SYSROOT "${OHOS_NATIVE_DIR}/sysroot")
if(NOT EXISTS "${OHOS_LLVM_BIN}/clang++")
message(FATAL_ERROR "clang++ not found at ${OHOS_LLVM_BIN}/clang++")
endif()
# GN toolchain uses bare "clang"/"clang++" names on this branch.
# Ensure OHOS LLVM binaries are visible in PATH for ninja commands.
vcpkg_add_to_path(PREPEND "${OHOS_LLVM_BIN}")
set(ENV{PATH} "${OHOS_LLVM_BIN}:$ENV{PATH}")
set(ENV{CC} "${OHOS_LLVM_BIN}/clang")
set(ENV{CXX} "${OHOS_LLVM_BIN}/clang++")
set(ENV{AR} "${OHOS_LLVM_BIN}/llvm-ar")
set(ENV{NM} "${OHOS_LLVM_BIN}/llvm-nm")
if(DEFINED VCPKG_DETECTED_CMAKE_C_COMPILER_TARGET AND NOT VCPKG_DETECTED_CMAKE_C_COMPILER_TARGET STREQUAL "")
set(OHOS_TARGET_TRIPLE "${VCPKG_DETECTED_CMAKE_C_COMPILER_TARGET}")
else()
set(OHOS_TARGET_TRIPLE "aarch64-linux-ohos")
endif()
set(OHOS_FLAGS "--target=${OHOS_TARGET_TRIPLE} --sysroot=${OHOS_SYSROOT} -Wno-sign-compare")
set(OHOS_CXX_FLAGS "${OHOS_FLAGS} -std=c++20")
string(APPEND OPTIONS " extra_cflags=\"${OHOS_FLAGS}\"")
string(APPEND OPTIONS " extra_cflags_cc=\"${OHOS_CXX_FLAGS}\"")
string(APPEND OPTIONS " extra_ldflags=\"${OHOS_FLAGS}\"")
# OHOS libc++ may miss std::ranges::copy in this SDK revision.
# Replace with std::copy_n to keep behavior equivalent.
vcpkg_replace_string(
"${SOURCE_PATH}/util/misc/uuid.cc"
"std::ranges::copy(bytes.subspan<8u, 2u>(), data_4);"
"std::copy_n(bytes.subspan<8u, 2u>().begin(), 2u, data_4);"
)
vcpkg_replace_string(
"${SOURCE_PATH}/util/misc/uuid.cc"
"std::ranges::copy(bytes.subspan<10u, 6u>(), data_5);"
"std::copy_n(bytes.subspan<10u, 6u>().begin(), 6u, data_5);"
)
vcpkg_replace_string(
"${SOURCE_PATH}/util/misc/uuid.cc"
"namespace crashpad {"
"#include <algorithm>\n\nnamespace crashpad {"
)
endif()
下面是最终稳定策略(按重要性排序):
1) 工具链与 PATH 注入
- 在 OHOS 分支中显式读取
OHOS_SDK_ROOT - 设置:
OHOS_LLVM_BIN=$OHOS_SDK_ROOT/native/llvm/binOHOS_SYSROOT=$OHOS_SDK_ROOT/native/sysroot
- 注入 PATH 与工具:
vcpkg_add_to_path(PREPEND "${OHOS_LLVM_BIN}")CC/CXX/AR/NM指向 OHOS llvm 工具
目的:确保 gn + ninja 子进程也能稳定找到 clang/clang++。
2) GN target_os 策略
- 对 OHOS 构建图使用:
target_os="linux"
- 但编译/链接参数仍使用 OHOS:
--target=aarch64-linux-ohos--sysroot=$OHOS_SYSROOT
原因:target_os="ohos" 在当前 Crashpad/mini_chromium GN 规则下实现不完整,容易导致链接缺符号。
3) C++ 标准与编译参数
extra_cflags_cc使用-std=c++20- 保持 OHOS 交叉编译参数在
extra_cflags/extra_cflags_cc/extra_ldflags中一致
原因:源码中使用了 concept、requires、<=> 等 C++20 特性。
4) uuid 的 ranges 兼容修复
OHOS SDK 的 libc++ 版本下,std::ranges::copy 不可用,替换为 std::copy_n:
std::ranges::copy(bytes.subspan<8u, 2u>(), data_4);
->std::copy_n(bytes.subspan<8u, 2u>().begin(), 2u, data_4);std::ranges::copy(bytes.subspan<10u, 6u>(), data_5);
->std::copy_n(bytes.subspan<10u, 6u>().begin(), 6u, data_5);
并补充 <algorithm> 头。
5) 拉取 lss 条件补齐
原逻辑只在 Android/Linux 下载 third_party/lss,补齐 OHOS:
VCPKG_TARGET_IS_ANDROID OR VCPKG_TARGET_IS_LINUX OR VCPKG_TARGET_IS_OHOS
避免出现:
third_party/lss/lss/linux_syscall_support.h: file not found
6) -Wsign-compare 兼容
针对 OHOS 系统头宏在 -Werror 下触发报错,追加:
-Wno-sign-compare
仅用于 OHOS 分支,减少对其他平台影响。
附完整的portfile.cmake文件:
bash
vcpkg_check_linkage(ONLY_STATIC_LIBRARY)
vcpkg_from_git(
OUT_SOURCE_PATH SOURCE_PATH
#URL https://chromium.googlesource.com/crashpad/crashpad
URL https://ghfast.top/https://github.com/chromium/crashpad
REF 7e0af1d4d45b526f01677e74a56f4a951b70517d
PATCHES
fix-linux.patch
fix-lib-name-conflict.patch
crashpad-memset-errors-5758170.diff # https://chromium-review.googlesource.com/c/crashpad/crashpad/+/7270947
)
vcpkg_find_acquire_program(PYTHON3)
x_vcpkg_get_python_packages(OUT_PYTHON_VAR PYTHON3
PYTHON_EXECUTABLE "${PYTHON3}"
PYTHON_VERSION "3"
PACKAGES setuptools
)
vcpkg_replace_string("${SOURCE_PATH}/.gn" "script_executable = \"python3\"" "script_executable = \"${PYTHON3}\"")
# mini_chromium contains the toolchains and build configuration
if(NOT EXISTS "${SOURCE_PATH}/third_party/mini_chromium/mini_chromium/BUILD.gn")
vcpkg_from_git(OUT_SOURCE_PATH mini_chromium
#URL "https://chromium.googlesource.com/chromium/mini_chromium"
URL "https://ghfast.top/https://github.com/chromium/mini_chromium"
REF dce72d97d1c2e9beb5e206c6a05a702269794ca3
PATCHES
fix-std-20.patch
ndk-toolchain.diff
fix-lib-name-conflict-1.patch
)
file(REMOVE_RECURSE "${SOURCE_PATH}/third_party/mini_chromium/mini_chromium")
file(RENAME "${mini_chromium}" "${SOURCE_PATH}/third_party/mini_chromium/mini_chromium")
endif()
if(NOT EXISTS "${SOURCE_PATH}/third_party/lss/lss/BUILD.gn" AND (VCPKG_TARGET_IS_ANDROID OR VCPKG_TARGET_IS_LINUX OR VCPKG_TARGET_IS_OHOS))
vcpkg_from_git(OUT_SOURCE_PATH lss
#URL https://chromium.googlesource.com/linux-syscall-support
URL https://ghfast.top/https://github.com/getsentry/linux-syscall-support
REF be2d5a80df9a9519cab306508ce902d774da76a9
)
file(REMOVE_RECURSE "${SOURCE_PATH}/third_party/lss/lss")
file(RENAME "${lss}" "${SOURCE_PATH}/third_party/lss/lss")
endif()
function(replace_gn_dependency INPUT_FILE OUTPUT_FILE LIBRARY_NAMES)
if(NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "debug")
unset(_LIBRARY_DEB CACHE)
find_library(_LIBRARY_DEB NAMES ${LIBRARY_NAMES}
PATHS "${CURRENT_INSTALLED_DIR}/debug/lib"
NO_DEFAULT_PATH)
if(_LIBRARY_DEB MATCHES "-NOTFOUND")
message(FATAL_ERROR "Could not find debug library with names: ${LIBRARY_NAMES}")
endif()
endif()
unset(_LIBRARY_REL CACHE)
find_library(_LIBRARY_REL NAMES ${LIBRARY_NAMES}
PATHS "${CURRENT_INSTALLED_DIR}/lib"
NO_DEFAULT_PATH)
if(_LIBRARY_REL MATCHES "-NOTFOUND")
message(FATAL_ERROR "Could not find library with names: ${LIBRARY_NAMES}")
endif()
if(VCPKG_BUILD_TYPE STREQUAL "release")
set(_LIBRARY_DEB ${_LIBRARY_REL})
endif()
set(_INCLUDE_DIR "${CURRENT_INSTALLED_DIR}/include")
file(REMOVE "${OUTPUT_FILE}")
configure_file("${INPUT_FILE}" "${OUTPUT_FILE}" @ONLY)
endfunction()
replace_gn_dependency(
"${CMAKE_CURRENT_LIST_DIR}/zlib.gn"
"${SOURCE_PATH}/third_party/zlib/BUILD.gn"
"z;zlib;zlibd"
)
set(OPTIONS "target_cpu=\"${VCPKG_TARGET_ARCHITECTURE}\"")
set(OPTIONS_DBG "is_debug=true")
set(OPTIONS_REL "")
if(VCPKG_TARGET_IS_ANDROID)
vcpkg_cmake_get_vars(cmake_vars_file)
include("${cmake_vars_file}")
string(APPEND OPTIONS " target_os=\"android\" android_ndk_root=\"${VCPKG_DETECTED_CMAKE_ANDROID_NDK}\"")
elseif(VCPKG_TARGET_IS_LINUX)
string(APPEND OPTIONS " target_os=\"linux\"")
elseif(VCPKG_TARGET_IS_OSX)
string(APPEND OPTIONS " target_os=\"mac\"")
elseif(VCPKG_TARGET_IS_WINDOWS AND NOT VCPKG_TARGET_IS_MINGW)
string(APPEND OPTIONS " target_os=\"win\"")
# Load toolchains
vcpkg_cmake_get_vars(cmake_vars_file)
include("${cmake_vars_file}")
set(OPTIONS_DBG "${OPTIONS_DBG} \
extra_cflags_c=\"${VCPKG_COMBINED_C_FLAGS_DEBUG}\" \
extra_cflags_cc=\"${VCPKG_COMBINED_CXX_FLAGS_DEBUG}\" \
extra_ldflags=\"${VCPKG_COMBINED_SHARED_LINKER_FLAGS_DEBUG}\" \
extra_arflags=\"${VCPKG_COMBINED_STATIC_LINKER_FLAGS_DEBUG}\"")
set(OPTIONS_REL "${OPTIONS_REL} \
extra_cflags_c=\"${VCPKG_COMBINED_C_FLAGS_RELEASE}\" \
extra_cflags_cc=\"${VCPKG_COMBINED_CXX_FLAGS_RELEASE}\" \
extra_ldflags=\"${VCPKG_COMBINED_SHARED_LINKER_FLAGS_RELEASE}\" \
extra_arflags=\"${VCPKG_COMBINED_STATIC_LINKER_FLAGS_RELEASE}\"")
set(DISABLE_WHOLE_PROGRAM_OPTIMIZATION "\
extra_cflags=\"/GL-\" \
extra_ldflags=\"/LTCG:OFF\" \
extra_arflags=\"/LTCG:OFF\"")
set(OPTIONS_DBG "${OPTIONS_DBG} ${DISABLE_WHOLE_PROGRAM_OPTIMIZATION}")
set(OPTIONS_REL "${OPTIONS_REL} ${DISABLE_WHOLE_PROGRAM_OPTIMIZATION}")
endif()
if(VCPKG_TARGET_IS_OHOS)
# Crashpad's GN rules don't fully model OHOS yet.
# Use the Linux target graph, but compile/link with OHOS toolchain + sysroot.
string(APPEND OPTIONS " target_os=\"linux\"")
# Load toolchain metadata exported by vcpkg.
vcpkg_cmake_get_vars(cmake_vars_file)
include("${cmake_vars_file}")
if(NOT DEFINED ENV{OHOS_SDK_ROOT})
message(FATAL_ERROR "Please set environment variable OHOS_SDK_ROOT")
endif()
set(OHOS_NATIVE_DIR "$ENV{OHOS_SDK_ROOT}/native")
set(OHOS_LLVM_BIN "${OHOS_NATIVE_DIR}/llvm/bin")
set(OHOS_SYSROOT "${OHOS_NATIVE_DIR}/sysroot")
if(NOT EXISTS "${OHOS_LLVM_BIN}/clang++")
message(FATAL_ERROR "clang++ not found at ${OHOS_LLVM_BIN}/clang++")
endif()
# GN toolchain uses bare "clang"/"clang++" names on this branch.
# Ensure OHOS LLVM binaries are visible in PATH for ninja commands.
vcpkg_add_to_path(PREPEND "${OHOS_LLVM_BIN}")
set(ENV{PATH} "${OHOS_LLVM_BIN}:$ENV{PATH}")
set(ENV{CC} "${OHOS_LLVM_BIN}/clang")
set(ENV{CXX} "${OHOS_LLVM_BIN}/clang++")
set(ENV{AR} "${OHOS_LLVM_BIN}/llvm-ar")
set(ENV{NM} "${OHOS_LLVM_BIN}/llvm-nm")
if(DEFINED VCPKG_DETECTED_CMAKE_C_COMPILER_TARGET AND NOT VCPKG_DETECTED_CMAKE_C_COMPILER_TARGET STREQUAL "")
set(OHOS_TARGET_TRIPLE "${VCPKG_DETECTED_CMAKE_C_COMPILER_TARGET}")
else()
set(OHOS_TARGET_TRIPLE "aarch64-linux-ohos")
endif()
set(OHOS_FLAGS "--target=${OHOS_TARGET_TRIPLE} --sysroot=${OHOS_SYSROOT} -Wno-sign-compare")
set(OHOS_CXX_FLAGS "${OHOS_FLAGS} -std=c++20")
string(APPEND OPTIONS " extra_cflags=\"${OHOS_FLAGS}\"")
string(APPEND OPTIONS " extra_cflags_cc=\"${OHOS_CXX_FLAGS}\"")
string(APPEND OPTIONS " extra_ldflags=\"${OHOS_FLAGS}\"")
# OHOS libc++ may miss std::ranges::copy in this SDK revision.
# Replace with std::copy_n to keep behavior equivalent.
vcpkg_replace_string(
"${SOURCE_PATH}/util/misc/uuid.cc"
"std::ranges::copy(bytes.subspan<8u, 2u>(), data_4);"
"std::copy_n(bytes.subspan<8u, 2u>().begin(), 2u, data_4);"
)
vcpkg_replace_string(
"${SOURCE_PATH}/util/misc/uuid.cc"
"std::ranges::copy(bytes.subspan<10u, 6u>(), data_5);"
"std::copy_n(bytes.subspan<10u, 6u>().begin(), 6u, data_5);"
)
vcpkg_replace_string(
"${SOURCE_PATH}/util/misc/uuid.cc"
"namespace crashpad {"
"#include <algorithm>\n\nnamespace crashpad {"
)
endif()
vcpkg_gn_configure(
SOURCE_PATH "${SOURCE_PATH}"
OPTIONS "${OPTIONS}"
OPTIONS_DEBUG "${OPTIONS_DBG}"
OPTIONS_RELEASE "${OPTIONS_REL}"
)
vcpkg_gn_install(
SOURCE_PATH "${SOURCE_PATH}"
TARGETS client client:common util third_party/mini_chromium/mini_chromium/base handler:crashpad_handler
)
message(STATUS "Installing headers...")
set(PACKAGES_INCLUDE_DIR "${CURRENT_PACKAGES_DIR}/include/${PORT}")
function(install_headers DIR)
file(COPY "${DIR}" DESTINATION "${PACKAGES_INCLUDE_DIR}" FILES_MATCHING PATTERN "*.h")
endfunction()
install_headers("${SOURCE_PATH}/client")
install_headers("${SOURCE_PATH}/util")
install_headers("${SOURCE_PATH}/third_party/mini_chromium/mini_chromium/base")
install_headers("${SOURCE_PATH}/third_party/mini_chromium/mini_chromium/build")
file(COPY "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel/gen/build/chromeos_buildflags.h" DESTINATION "${CURRENT_PACKAGES_DIR}/include/${PORT}/build")
file(COPY "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel/gen/build/chromeos_buildflags.h.flags" DESTINATION "${CURRENT_PACKAGES_DIR}/include/${PORT}/build")
# On Windows/MSVC, mirror headers into the root include directory so MSBuild integration
# (which adds only <installed>/include) can resolve un-namespaced includes like
# "client/..." and "base/...".
if(VCPKG_TARGET_IS_WINDOWS AND NOT VCPKG_TARGET_IS_MINGW)
message(STATUS "Mirroring headers into include root for MSBuild consumption...")
file(COPY "${SOURCE_PATH}/client" DESTINATION "${CURRENT_PACKAGES_DIR}/include" FILES_MATCHING PATTERN "*.h")
file(COPY "${SOURCE_PATH}/util" DESTINATION "${CURRENT_PACKAGES_DIR}/include" FILES_MATCHING PATTERN "*.h")
file(COPY "${SOURCE_PATH}/third_party/mini_chromium/mini_chromium/base" DESTINATION "${CURRENT_PACKAGES_DIR}/include" FILES_MATCHING PATTERN "*.h")
file(COPY "${SOURCE_PATH}/third_party/mini_chromium/mini_chromium/build" DESTINATION "${CURRENT_PACKAGES_DIR}/include" FILES_MATCHING PATTERN "*.h")
file(COPY "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel/gen/build/chromeos_buildflags.h" DESTINATION "${CURRENT_PACKAGES_DIR}/include/build")
file(COPY "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel/gen/build/chromeos_buildflags.h.flags" DESTINATION "${CURRENT_PACKAGES_DIR}/include/build")
endif()
if(VCPKG_TARGET_IS_OSX)
if(NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "debug")
file(COPY "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-dbg/obj/util/libmig_output.a" DESTINATION "${CURRENT_PACKAGES_DIR}/debug/lib")
endif()
file(COPY "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel/obj/util/libmig_output.a" DESTINATION "${CURRENT_PACKAGES_DIR}/lib")
endif()
vcpkg_copy_tools(
TOOL_NAMES crashpad_handler
SEARCH_DIR "${CURRENT_PACKAGES_DIR}/tools")
if(NOT VCPKG_TARGET_IS_WINDOWS OR VCPKG_TARGET_IS_MINGW)
file(CHMOD "${CURRENT_PACKAGES_DIR}/tools/crashpad_handler" FILE_PERMISSIONS
OWNER_READ OWNER_WRITE OWNER_EXECUTE
GROUP_READ GROUP_EXECUTE
WORLD_READ WORLD_EXECUTE
)
endif()
# remove empty directories
file(REMOVE_RECURSE
"${PACKAGES_INCLUDE_DIR}/util/net/testdata"
"${PACKAGES_INCLUDE_DIR}/build/ios")
if(VCPKG_TARGET_IS_WINDOWS AND NOT VCPKG_TARGET_IS_MINGW)
file(REMOVE_RECURSE
"${CURRENT_PACKAGES_DIR}/include/util/net/testdata"
"${CURRENT_PACKAGES_DIR}/include/build/ios")
endif()
configure_file("${CMAKE_CURRENT_LIST_DIR}/crashpadConfig.cmake.in"
"${CURRENT_PACKAGES_DIR}/share/${PORT}/crashpadConfig.cmake" @ONLY)
file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/include/${PORT}/build/config")
file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/include/${PORT}/util/mach/__pycache__")
if(VCPKG_TARGET_IS_WINDOWS AND NOT VCPKG_TARGET_IS_MINGW)
# Remove empty directory created under the mirrored root include
file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/include/build/config")
endif()
vcpkg_copy_pdbs()
vcpkg_install_copyright(FILE_LIST "${SOURCE_PATH}/LICENSE")
四、为什么会这么多错误(经验总结)
根本原因不是单点,而是"多层耦合":
crashpad不是纯 CMake,核心链路是GN + ninja- OHOS 是 Linux-like,但并不等同 Linux
mini_chromium与crashpad的 GN 规则对新平台覆盖有限- 标准库实现差异(特别是 libc++ 版本)会在 C++20 特性处放大问题
所以采用"分层收敛"思路:
- 先解决工具链发现(PATH/CC/CXX)
- 再解决 GN 图生成(target_os)
- 再解决编译标准(C++20)
- 最后处理平台差异与链接缺口
五、如何使用(接入说明)
1) 安装 Crashpad(OHOS)
bash
export OHOS_SDK_ROOT=/root/ohos-sdk/linux/
# 建议每轮改 portfile 后清理缓存
rm -rf /root/vcpkg/buildtrees/crashpad
vcpkg install crashpad:arm64-ohos
成功后可见典型产物:
installed/arm64-ohos/lib/libvcpkg_crashpad_client.ainstalled/arm64-ohos/lib/libvcpkg_crashpad_client_common.ainstalled/arm64-ohos/lib/libvcpkg_crashpad_util.ainstalled/arm64-ohos/lib/libvcpkg_crashpad_base.ainstalled/arm64-ohos/tools/crashpad_handler
2) CMake 项目中使用
cmake
find_package(crashpad CONFIG REQUIRED)
target_link_libraries(main PRIVATE crashpad::crashpad)
说明:这是 vcpkg 导出的聚合目标写法,实际是否需要附加手工链接项取决于你的业务调用路径和静态链接策略。
3) 运行时注意事项(OHOS)
crashpad_handler需要以目标系统可执行方式部署- 注意可执行权限、路径可达性与进程拉起方式
- 上报相关功能若依赖网络,请检查 OHOS 侧网络与证书环境
六、报错问题(FAQ)
1.vcpkg.json元数据未修改导致ohos系统:

解决办法如下:

2.环境变量未设置,报一下错误:

解决办法,设置OHOS的SDK环境变量:

3.源码下载失败,这是因为这些代码访问不到,需配置镜像

解决办法:设置镜像,如:

七、结语
这次移植虽然曲折,但结果已经稳定跑通,说明方向是正确的:
用 Linux 构建图 + OHOS 工具链/ABI,辅以少量源码兼容补丁,可以让 Crashpad 在 OHOS 上落地。
后续如果升级到新的 OHOS SDK 或 Crashpad 版本,优先回归验证三类点:
- C++ 标准与 libc++ 能力
- GN 平台分支变化
third_party依赖拉取条件
最后,欢迎加入开源鸿蒙开发者社区交流:https://harmonypc.csdn.net/