HarmonyOS / OpenHarmony 平台三方库移植:使用vcpkg 移植 Crashpad 过程实战总结

本文记录了使用 vcpkgcrashpad 移植到 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_linuxis_androidis_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.a
  • Installing: .../tools/crashpad_handler
  • All 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

二、问题与修复总览

本次排障大致经历了以下阶段:

  1. 找不到 clang++
  2. GN 配置中未定义标识符(common_flags / cflags
  3. C++ 标准不匹配(C++17 vs C++20)
  4. OHOS libc++ 对部分 ranges 能力不完整
  5. 链接缺符号(OHOS GN 路径不完整)
  6. 缺少 third_party/lss
  7. 系统头宏触发 -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/bin
    • OHOS_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 中一致

原因:源码中使用了 conceptrequires<=> 等 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_chromiumcrashpad 的 GN 规则对新平台覆盖有限
  • 标准库实现差异(特别是 libc++ 版本)会在 C++20 特性处放大问题

所以采用"分层收敛"思路:

  1. 先解决工具链发现(PATH/CC/CXX)
  2. 再解决 GN 图生成(target_os)
  3. 再解决编译标准(C++20)
  4. 最后处理平台差异与链接缺口

五、如何使用(接入说明)

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.a
  • installed/arm64-ohos/lib/libvcpkg_crashpad_client_common.a
  • installed/arm64-ohos/lib/libvcpkg_crashpad_util.a
  • installed/arm64-ohos/lib/libvcpkg_crashpad_base.a
  • installed/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 版本,优先回归验证三类点:

  1. C++ 标准与 libc++ 能力
  2. GN 平台分支变化
  3. third_party 依赖拉取条件

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

相关推荐
Utopia^11 小时前
鸿蒙flutter第三方库适配 - 联系人备份工具
flutter·华为·harmonyos
音视频牛哥12 小时前
国产化最后一公里:鸿蒙 NEXT 低延迟音视频技术方案破局之路
音视频·harmonyos·鸿蒙next·鸿蒙rtmp播放器·鸿蒙rtsp播放器·鸿蒙next rtsp播放器·鸿蒙next rtmp播放器
HwJack2015 小时前
HarmonyOS UI 开发中eventHub用标准化 OHMUrl 拿捏集成态 HSP
华为·harmonyos
音视频牛哥16 小时前
鸿蒙 NEXT 行业视频方案选型:消费级播放器、自研、SmartMediaKit,哪条路走得通?
华为·harmonyos·大牛直播sdk·鸿蒙rtsp播放器·鸿蒙next rtsp播放器·鸿蒙next rtmp播放器·鸿蒙 rtmp播放器
Geek_Vision19 小时前
鸿蒙原生APP接入小程序运行能力:数字园区场景实战复盘
微信小程序·harmonyos
音视频牛哥20 小时前
鸿蒙 NEXT 下 RTSP/RTMP 播放器如何调用录像与快照?
华为·harmonyos·鸿蒙rtmp播放器·鸿蒙rtsp播放器·鸿蒙next rtsp播放器·鸿蒙next rtmp播放器·鸿蒙rtsp rtmp流录像
音视频牛哥20 小时前
鸿蒙 NEXT 下 RTSP/RTMP 播放器如何实时调节音量、亮度、对比度与饱和度?
harmonyos·音视频开发·直播
音视频牛哥21 小时前
鸿蒙 NEXT RTSP/RTMP 播放器如何回调 RGB 数据并实现 AI 视觉算法分析
人工智能·算法·harmonyos·鸿蒙rtmp播放器·鸿蒙rtsp播放器·鸿蒙next rtsp播放器·鸿蒙next rtmp播放器
音视频牛哥1 天前
HarmonyOS鸿蒙 Next 中如何实现低延迟 RTSP 流媒体播放?
华为·harmonyos·鸿蒙next·鸿蒙rtmp播放器·鸿蒙rtsp播放器·鸿蒙next rtsp播放器·鸿蒙next rtmp播放器