GN构建工程配置HarmonyOS编译工具链
======================

#### 概述

本文将介绍如何在GN工程中配置HarmonyOS工具链，然后通过HarmonyOS工具链编译出可以在HarmonyOS环境下使用的三方库。

HarmonyOS编译子系统是以GN和Ninja构建为基座，对构建和配置粒度进行部件化抽象、对内建模块进行功能增强、对业务模块进行功能扩展的系统，该系统提供以下基本功能：

*   以部件为最小粒度拼装产品和独立编译。
*   支持轻量、小型、标准三种系统的解决方案级版本构建，以及用于支撑应用开发者使用DevEco Studio开发的SDK开发套件的构建。
*   支持芯片解决方案厂商的灵活定制和独立编译。

**Ninja：** 是一个专注于快速编译的小型构建系统。

**GN：** Generate Ninja的缩写，用于产生Ninja文件。

#### 编译环境配置

1.  Linux编译环境搭建（如果已有对应版本的Linux开发环境，可跳过Linux环境搭建过程）：详细指导见以下链接。
    
    [使用 WSL 在 Windows 上安装 Linux](https://learn.microsoft.com/zh-cn/windows/wsl/install)。
    
    [Ubuntu分发版本获取及安装说明](https://learn.microsoft.com/zh-cn/windows/wsl/install-manual)。
    
    编译环境目前主要支持Ubuntu18.04和Ubuntu20.04。
    
2.  HarmonyOS SDK镜像下载：
    
    从HarmonyOS官网门户选择Linux版本的Command Line Tools下载即可。
    
    [下载链接](https://developer.huawei.com/consumer/cn/download/)。
    
3.  安装构建工具depot\_tools并添加到环境变量。
    
    任意位置创建工作目录depot\_tools，cd到自己创建的目录，拉取工具（需要网络环境）：
    
    mkdir depot\_tools
    cd depot\_tools
    git clone https://chromium.googlesource.com/chromium/tools/depot\_tools.git
    
    将depot\_tools的路径加到环境变量中：
    
    编辑.bashrc文件将depot\_tools路径信息加到最后一行。
    
    vi ~/.bashrc
    
    在.bashrc文件的最后添加下面一行代码。
    
    ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/92/v3/1ba4HVyQQ_GLMlAc4UDU_A/zh-cn_image_0000002594829622.png?HW-CC-KV=V1&HW-CC-Date=20260612T073815Z&HW-CC-Expire=86400&HW-CC-Sign=38C978F8C00FACEF4888BA094AA45630CB2DEDFA6C70CC33F82F092EA629597F)
    
    export PATH="$PATH:/xxx/depot\_tools"
    
    此处需配置绝对路径信息，例如这里创建的本地路径是/mnt/d/my\_code/depot\_tools，故此处配置如上图。
    
    刷新环境变量使其生效：
    
    source ~/.bashrc
    
4.  使用GN需要Python环境，安装Python环境。
    
    sudo apt update
    sudo apt install python
    
    直接输入指令sudo apt install python可能会安装失败，需要先输入sudo apt update更新一下可用包的最新列表。
    
    ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/bb/v3/8NNFPppVQC6-12jBi7S-DA/zh-cn_image_0000002625189069.png?HW-CC-KV=V1&HW-CC-Date=20260612T073815Z&HW-CC-Expire=86400&HW-CC-Sign=B8C6A9C6C131105EB54D4B99E0E7DB6B25A30A548613BE410254F69D23CF9FDC)
    
    判断python是否安装成功：
    
    输入python显示python版本即可。
    
    ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/a9/v3/cplza8EzQxCmOdR4qjPRXw/zh-cn_image_0000002625109213.png?HW-CC-KV=V1&HW-CC-Date=20260612T073815Z&HW-CC-Expire=86400&HW-CC-Sign=6743D1F15405126DF9BCABA2CF1E6103689C42909E1D7D56A3FAA09E1DF5B642)
    

#### GN构建工程适配流程

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/01/v3/oAyNtCDqRHqmcd9ovdOEVg/zh-cn_image_0000002594669696.png?HW-CC-KV=V1&HW-CC-Date=20260612T073815Z&HW-CC-Expire=86400&HW-CC-Sign=B71133F5A5C8D6B2A7850DDA25BB2E84C349CA77ABD7E9E5539DC1A27F9C8C8B)

1.  新增HarmonyOS平台的宏定义。
2.  配置HarmonyOS平台的工具链核心信息，涵盖clang工具链路径，sysroot系统根目录以及clang版本等关键参数。
3.  在toolchain目录下，为各架构分别配置对应的ohos\_clang\_toolchain。
4.  扩充gcc\_toolchain模版功能，补充HarmonyOS启动引导程序所需的.o文件相关配置。
5.  设置HarmonyOS编译参数，重点配置基础编译选项、宏定义等核心内容。
6.  在BUILD.gn文件的各架构平台分支逻辑中，新增HarmonyOS平台对应的分支配置；对于暂未适配HarmonyOS的三方库，可暂时沿用Linux分支的编译配置。

#### webRTC适配案例

本文将通过webRTC的GN构建工程案例来对上一章节的流程进行实操讲解。WebRTC (Web Real-Time Communications) 是一项实时通讯技术，它允许网络应用或者站点，在不借助中间媒介的情况下，建立浏览器之间点对点（Peer-to-Peer）的连接，实现视频流和（或）音频流或者其他任意数据的传输。下面了解下如何通过GN构建工程将webRTC适配到HarmonyOS系统上。

三方库获取地址：[下载链接](https://gitee.com/openharmony/build)。

#### \[h2\]适配流程

1.  **添加HarmonyOS平台宏定义**
    
    这里主要在build/config/BUILDCONFIG.gn文件中适配HarmonyOS的default\_compiler\_configs和\_default\_toolchain。在GN工程里面，BUILDCONFIG.gn是第一位被解析的，里面定义的变量相当于全局变量，可以被后续所有的.gn文件使用。编译过程中可能会配置一些编译选项以及一些头文件搜索路径。default\_compiler\_configs指向的文件里面会包括一些默认的编译选项以及头文件搜索路径等等。\_default\_toolchain指向了一个工具链相关的函数。具体修改点如下：
    
    ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/3e/v3/X4sTato-R3S7QoF9kGBuvA/zh-cn_image_0000002594829624.png?HW-CC-KV=V1&HW-CC-Date=20260612T073815Z&HW-CC-Expire=86400&HW-CC-Sign=145A17C3FD89C0DD7D5F7DDF1B8622959E47281B9B6841B4A5698870B98CF4A3)
    
2.  **设置HarmonyOS平台clang工具链相关路径**
    
    不同平台的工具链会有一些差别，所以需要使用HarmonyOS的工具链。这里主要修改config/clang/clang.gni文件。.gni文件类似于GN的头文件，会被import到各个.gn文件中使用其定义的一些变量。该文件中的核心修改点在于配置指向HarmonyOS SDK的工具链路径。另外还需修改clang\_use\_chrome\_plugins的值为false，HarmonyOS中默认clang\_use\_chrome\_plugins值为false，不设置可能会报错find-bad-constructs文件找不到。
    
    此处ohos\_sdk\_native\_root的值需要对应修改为自己本地HarmonyOS SDK中的native的路径。具体修改点如下：
    
    ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/16/v3/YS5yX53_RZyV-x_oonGdDw/zh-cn_image_0000002625189071.png?HW-CC-KV=V1&HW-CC-Date=20260612T073815Z&HW-CC-Expire=86400&HW-CC-Sign=EC195ADED242FC638FA9A8AF2E3DA67FE7C2ECCA9BCCA4569CDF77BAA18BC5DE)
    
3.  **设置HarmonyOS平台sysroot路径**
    
    这里主要修改build/config/sysroot.gni文件，sysroot里面包含了许多头文件搜索路径，配置了sysroot之后，编译过程中会去该目录下搜索需要的头文件。SDK里面会提供大量的头文件，这些头文件都会放在sysroot目录下，所以需要引入HarmonyOS对应的sysroot。具体修改点如下：
    
    ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/49/v3/kNrul-4IRqOP66zr-DEl0g/zh-cn_image_0000002625109215.png?HW-CC-KV=V1&HW-CC-Date=20260612T073815Z&HW-CC-Expire=86400&HW-CC-Sign=57E77D3AA592F67AAC68645761BA74C25124D9F4319FC3BF3838E46D74BE0398)
    
4.  **修改HarmonyOS平台clang版本**
    
    这里主要修改build/toolchain/toolchain.gni文件，在该文件中配置HarmonyOS对应的clang版本号。具体修改点如下：
    
    ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/57/v3/xMT1297ZQ9iOGA4qLL31IA/zh-cn_image_0000002594669698.png?HW-CC-KV=V1&HW-CC-Date=20260612T073815Z&HW-CC-Expire=86400&HW-CC-Sign=BD2D169FEF491A9241BA3CBC4F6669F32C1160EBB4E5960AAE44ED49C9969453)
    
5.  **设置各个架构的ohos\_clang\_toolchain**
    
    这里主要是在build/toolchain路径下新建一个ohos/BUILD.gn文件，用于配置ohos\_clang\_toolchain，里面主要配置了HarmonyOS用于启动引导程序的.o文件。同时设置HarmonyOS不同架构(主要包括ohos\_clang\_arm、ohos\_clang\_arm64、ohos\_clang\_x86\_64)的ohos\_clang\_toolchain配置信息。具体添加内容如下：
    
    import("//build/config/sysroot.gni")
    import("//build/toolchain/gcc\_toolchain.gni")
    
    declare\_args() {
      # Whether unstripped binaries, i.e. compiled with debug symbols, should be
      # considered runtime\_deps rather than stripped ones.
      ohos\_unstripped\_runtime\_outputs = true
      ohos\_extra\_cflags = ""
      ohos\_extra\_cppflags = ""
      ohos\_extra\_cxxflags = ""
      ohos\_extra\_asmflags = ""
      ohos\_extra\_ldflags = ""
    }
    
    # The ohos clang toolchains share most of the same parameters, so we have this
    # wrapper around gcc\_toolchain to avoid duplication of logic.
    #
    # Parameters:
    #  - toolchain\_root
    #      Path to cpu-specific toolchain within the ndk.
    #  - sysroot
    #      Sysroot for this architecture.
    #  - lib\_dir
    #      Subdirectory inside of sysroot where libs go.
    #  - binary\_prefix
    #      Prefix of compiler executables.
    template("ohos\_clang\_toolchain") {
      gcc\_toolchain(target\_name) {
        assert(defined(invoker.toolchain\_args),
               "toolchain\_args must be defined for ohos\_clang\_toolchain()")
        toolchain\_args = invoker.toolchain\_args
        toolchain\_args.current\_os = "ohos"
    
        # Output linker map files for binary size analysis.
        enable\_linker\_map = true
    
        ohos\_libc\_dir =
            rebase\_path(invoker.sysroot + "/" + invoker.lib\_dir, root\_build\_dir)
        libs\_section\_prefix = "${ohos\_libc\_dir}/Scrt1.o"
        libs\_section\_prefix += " ${ohos\_libc\_dir}/crti.o"
        libs\_section\_postfix = "${ohos\_libc\_dir}/crtn.o"
    
        if (invoker.target\_name == "ohos\_clang\_arm") {
          abi\_target = "arm-linux-ohos"
        } else if (invoker.target\_name == "ohos\_clang\_arm64") {
          abi\_target = "aarch64-linux-ohos"
        } else if (invoker.target\_name == "ohos\_clang\_x86\_64") {
          abi\_target = "x86\_64-linux-ohos"
        }
    
        clang\_rt\_dir =
            rebase\_path("${clang\_lib\_path}/${abi\_target}/nanlegacy",
                        root\_build\_dir)
        print("ohos\_libc\_dir :", ohos\_libc\_dir)
        print("clang\_rt\_dir :", clang\_rt\_dir)
        solink\_libs\_section\_prefix = "${ohos\_libc\_dir}/crti.o"
        solink\_libs\_section\_prefix += " ${clang\_rt\_dir}/clang\_rt.crtbegin.o"
        solink\_libs\_section\_postfix = "${ohos\_libc\_dir}/crtn.o"
        solink\_libs\_section\_postfix += " ${clang\_rt\_dir}/clang\_rt.crtend.o"
    
        \_prefix = rebase\_path("${clang\_base\_path}/bin", root\_build\_dir)
        cc = "${\_prefix}/clang"
        cxx = "${\_prefix}/clang++"
        ar = "${\_prefix}/llvm-ar"
        ld = cxx
        readelf = "${\_prefix}/llvm-readobj"
        nm = "${\_prefix}/llvm-nm"
        if (!is\_debug) {
          strip = rebase\_path("${clang\_base\_path}/bin/llvm-strip", root\_build\_dir)
          use\_unstripped\_as\_runtime\_outputs = ohos\_unstripped\_runtime\_outputs
        }
        extra\_cflags = ohos\_extra\_cflags
        extra\_cppflags = ohos\_extra\_cppflags
        extra\_cxxflags = ohos\_extra\_cxxflags
        extra\_asmflags = ohos\_extra\_asmflags
        extra\_ldflags = ohos\_extra\_ldflags
      }
    }
    
    ohos\_clang\_toolchain("ohos\_clang\_arm") {
      sysroot = "${sysroot}"
      lib\_dir = "usr/lib/arm-linux-ohos"
      toolchain\_args = {
        current\_cpu = "arm"
      }
    }
    
    ohos\_clang\_toolchain("ohos\_clang\_arm64") {
      sysroot = "${sysroot}"
      lib\_dir = "usr/lib/aarch64-linux-ohos"
      toolchain\_args = {
        current\_cpu = "arm64"
      }
    }
    
    ohos\_clang\_toolchain("ohos\_clang\_x86\_64") {
      sysroot = "${sysroot}"
      lib\_dir = "usr/lib/x86\_64-linux-ohos"
      toolchain\_args = {
        current\_cpu = "x86\_64"
      }
    }
    
6.  **扩充原本的gcc\_toolchain模版功能**
    
    主要修改/build/toolchain/gcc\_toolchain.gni文件。GN工程里面默认会配置gcc\_toolchain，里面会包括一些tool，例如tool("cc")、tool("cxx")、tool("tolink")等等，编译不同的内容时调用其对应的配置项。这里主要是需要修改tool("solink")、tool("solink\_module")中的rspfile\_content配置以及tool("link")中的link\_comand配置。需要在gcc\_toolchain.gni中template("gcc\_toolchain")下添加几个参数（libs\_section\_prefix、libs\_section\_postfix 、solink\_libs\_section\_prefix、solink\_libs\_section\_postfix ）的识别。这几个参数是指向了上一步骤中配置的用于启动引导程序的.o文件。这些参数会在需要修改的rspfile\_content、link\_comand参数中用到。具体修改如下：
    
    ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/48/v3/uYzRzXvvQ7Cy3HXihzMbRw/zh-cn_image_0000002594829626.png?HW-CC-KV=V1&HW-CC-Date=20260612T073815Z&HW-CC-Expire=86400&HW-CC-Sign=EED200C79C2ABC3819B421A75B13B08B16B92A1E6E131EF757D02A911BBE6AF4)
    
    修改tool("solink")和tool("solink\_module")中的rspfile\_content为rspfile\_content = "-Wl,--whole-archive {{inputs}} {{solibs}} -Wl,--no-whole-archive $solink\_libs\_section\_prefix {{libs}} $solink\_libs\_section\_postfix"，这里需要用到刚刚定义的参数信息。具体修改如下：
    
    ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/1f/v3/fJxCaZccRgOx4HgG1SgmdA/zh-cn_image_0000002625189073.png?HW-CC-KV=V1&HW-CC-Date=20260612T073815Z&HW-CC-Expire=86400&HW-CC-Sign=FFA5BEB083325B21B5A34AEAA1FFA4D480B2018992F0F4DE3B8412A9173DA7C5)
    
    ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/da/v3/Yc4cCFb_TfWO32COC71J2Q/zh-cn_image_0000002625109217.png?HW-CC-KV=V1&HW-CC-Date=20260612T073815Z&HW-CC-Expire=86400&HW-CC-Sign=F94BA4F9DDDB0E452A234222CEF27501A5384A1CAAC8465069CA15246579ED31)
    
    修改tool("link")中link\_command为link\_command = "$ld {{ldflags}}${extra\_ldflags} -o \\"$unstripped\_outfile\\" $libs\_section\_prefix $start\_group\_flag @\\"$rspfile\\" {{solibs}} {{libs}} $end\_group\_flag $libs\_section\_postfix"，这里需要用到刚刚定义的参数信息。
    
    ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/ba/v3/BXCrLYAxR3ebtdd425SAuw/zh-cn_image_0000002594669700.png?HW-CC-KV=V1&HW-CC-Date=20260612T073815Z&HW-CC-Expire=86400&HW-CC-Sign=09146C33D69093A447B34134E5B2A9D85E5A0FDD815412A49E29C983CBA122E2)
    
7.  **设置HarmonyOS的一些编译参数，将其加入到BUILDCONFIG.gn中**
    
    这里需要在build/config路径下新建一个ohos/BUILD.gn文件，该文件主要是定义了一个config("compiler")，该config会被注册到所有的编译目标，该config里面主要设置了基础的编译选项、宏定义等。
    
    此处ohos\_clang\_base\_path 的值需要对应修改为自己本地HarmonyOS SDK中的llvm的路径。具体添加内容如下：
    
    import("//build/config/sysroot.gni")
    assert(is\_ohos)
    
    ohos\_clang\_base\_path = "/mnt/d/ohos/ohos-sdk/linux/native/llvm"
    ohos\_clang\_version = "15.0.4"
    
    if (is\_ohos) {
      if (current\_cpu == "arm") {
        abi\_target = "arm-linux-ohos"
      } else if (current\_cpu == "x86") {
        abi\_target = ""
      } else if (current\_cpu == "arm64") {
        abi\_target = "aarch64-linux-ohos"
      } else if (current\_cpu == "x86\_64") {
        abi\_target = "x86\_64-linux-ohos"
      } else {
        assert(false, "Architecture not supported")
      }
    }
    
    config("compiler") {
      cflags = \[
        "-ffunction-sections",
        "-fno-short-enums",
        "-fno-addrsig",
      \]
    
      cflags += \[
        "-Wno-unknown-warning-option",
        "-Wno-int-conversion",
        "-Wno-unused-variable",
        "-Wno-misleading-indentation",
        "-Wno-missing-field-initializers",
        "-Wno-unused-parameter",
        "-Wno-c++11-narrowing",
        "-Wno-unneeded-internal-declaration",
        "-Wno-undefined-var-template",
        "-Wno-implicit-int-float-conversion",
      \]
      defines = \[
        # The NDK has these things, but doesn't define the constants to say that it
        # does. Define them here instead.
        "HAVE\_SYS\_UIO\_H",
      \]
    
      defines += \[
        "OHOS",
        "\_\_MUSL\_\_",
        "\_LIBCPP\_HAS\_MUSL\_LIBC",
        "\_\_BUILD\_LINUX\_WITH\_CLANG",
        "\_\_GNU\_SOURCE",
        "\_GNU\_SOURCE",
      \]
    
      ldflags = \[
        "-Wl,--no-undefined",
        "-Wl,--exclude-libs=libunwind\_llvm.a",
        "-Wl,--exclude-libs=libc++\_static.a",
    
        # Don't allow visible symbols from libraries that contain
        # assembly code with symbols that aren't hidden properly.
        # http://crbug.com/448386
        "-Wl,--exclude-libs=libvpx\_assembly\_arm.a",
      \]
    
      cflags += \[ "--target=$abi\_target" \]
      include\_dirs = \[
        "${sysroot}/usr/include/${abi\_target}",
        "${ohos\_clang\_base\_path}/lib/clang/${ohos\_clang\_version}/include",
      \]
    
      ldflags += \[ "--target=$abi\_target" \]
    
      # Assign any flags set for the C compiler to asmflags so that they are sent
      # to the assembler.
      asmflags = cflags
    }
    
8.  **build/config/compiler/BUILD.gn中增加对is\_ohos的判断**
    
    保证可以正确走HarmonyOS支持的编译分支。这里主要是为了防止clang版本号校验失败导致异常。具体修改如下：
    
    ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/51/v3/CRfBj3YHRUyh6j-Yg0KDWQ/zh-cn_image_0000002594829628.png?HW-CC-KV=V1&HW-CC-Date=20260612T073815Z&HW-CC-Expire=86400&HW-CC-Sign=A8A4887D0C2216AA253F34F4250C16804DA2A6733A13092F2AA9153FE8057AB8)
    
9.  **未适配HarmonyOS的三方库走linux编译配置**
    
    当前部分三方库还未适配HarmonyOS，涉及到时可以先走linux的编译配置，例如：需要获取config.h文件时。
    
    修改modules/video\_capture的BUILD.gn。具体修改如下：
    
    ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/9a/v3/Pi6fLE_6RjO23DbSl7DGKA/zh-cn_image_0000002625189075.png?HW-CC-KV=V1&HW-CC-Date=20260612T073815Z&HW-CC-Expire=86400&HW-CC-Sign=7F5F7C215AB3357839974E39D401D1C62F007D94A316CA14FA16C3F74BA27A10)
    
    修改third\_party/zlib的BUILD.gn。具体修改如下：
    
    ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/4f/v3/ZqJNrMMHTEm4IEWlln5VOA/zh-cn_image_0000002625109219.png?HW-CC-KV=V1&HW-CC-Date=20260612T073815Z&HW-CC-Expire=86400&HW-CC-Sign=17502905D644320B538F4FCB8D221772114E2F3E5348ED371D2D4C4D0CC4836E)
    
    修改third\_party/libevent中的BUILD.gn。HarmonyOS SDK中没有queue.h头文件，需要使用compat dir目录下的queue.h头文件。具体修改如下：
    
    ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/79/v3/ul6JoNe-RI6ZsZ6PwjRurg/zh-cn_image_0000002594669702.png?HW-CC-KV=V1&HW-CC-Date=20260612T073815Z&HW-CC-Expire=86400&HW-CC-Sign=FF7173E6DF9C411B5010F39A76800EAC4560E47ADD7B47D9CEA91F4FD0C534C2)
    
10.  **编译**
     
     先通过GN命令生成对应的ninja文件，然后使用ninja编译命令进行编译。
     
     gn gen ../out/xxx --args='is\_clang=true target\_os="ohos" target\_cpu="arm64" xxx'
     ninja -v -C ../out/xxx ${target\_name} -j16
     
     可以根据需要在编译指令中添加对应参数信息。
     
     查看具体编译命令：
     
     可以在gn gen命令中添加--ninja-args="-v -dkeeprsp"用于查看具体编译命令，这个命令将会在编译过程中打印详细的编译命令，并且保留编译过程中生成的rsp文件。
     
     查看一个目标被谁依赖：
     
     例如gn refs out/intermediate/arm64\_72 //pc:rtc\_pc\_base。这个命令将显示与目标//pc:rtc\_pc\_base相关的所有依赖项并列出所有引用了该目标的其他目标或文件。
     

#### \[h2\]常见问题总结

在对webRTC的GN工程进行HarmonyOS工具链适配过程中，遇到了一些常见问题场景。下面针对这些问题做一个具体分析。

1.  **Assertion failed. Unsupported ARM OS**
    
    **问题详情：**
    
    ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/75/v3/AgDckbicQdyebsxKXjTOxg/zh-cn_image_0000002594829630.png?HW-CC-KV=V1&HW-CC-Date=20260612T073815Z&HW-CC-Expire=86400&HW-CC-Sign=507142B0A6F1AAF91A1A415225034EAABBB71B42E13B9FB457ED3A7D55740763)
    
    **问题原因/解决措施：**
    
    三方库内部没有做对is\_ohos的判断，导致走到错误分支。当前很多业务模块还未适配HarmonyOS，暂时可以走linux分支以保证正常编译。
    
    **具体修改：**
    
    修改third\_party/zlib的BUILD.gn文件。
    
    ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/6d/v3/W72NMZeaQui0tJ7XvzaMQg/zh-cn_image_0000002625189077.png?HW-CC-KV=V1&HW-CC-Date=20260612T073815Z&HW-CC-Expire=86400&HW-CC-Sign=D15D406C166E1DD7A2425EE6B67E4F988EE0D56CB0CA3DA3AFCA65586609C759)
    
2.  **python找不到pkg-config文件：No such file or directory: 'pkg-config'**
    
    **问题详情：**
    
    ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/2b/v3/sKw61ivSRGmG_3PG-idy3g/zh-cn_image_0000002625109221.png?HW-CC-KV=V1&HW-CC-Date=20260612T073815Z&HW-CC-Expire=86400&HW-CC-Sign=E0048BC34923C5DD04B9A85BE5CD16B193FD8EF9776BF3E3F57FC85CBE3BE8BB)
    
    **问题原因/解决措施：**
    
    缺少pkg-config插件，安装该插件。
    
    **具体指令：**
    
    sudo apt-get install pkg-config
    
3.  **Unknown command line argument '-split-threshold-for-reg-with-hint=0'**
    
    **问题详情：**
    
    ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/39/v3/kPsjQ6aGT9OKQJwnMoR4DA/zh-cn_image_0000002594669704.png?HW-CC-KV=V1&HW-CC-Date=20260612T073815Z&HW-CC-Expire=86400&HW-CC-Sign=CFF63ED9086933D0FB24769C6C12CD78AB8B2496E9A86AF48BB5A2D24B143685)
    
    **问题原因/解决措施：**
    
    编译过程中会提示部分配置不识别，需要将这些配置项删除。
    
    **具体修改：**
    
    在build/config/compiler/BUILD.gn中删除以下配置。
    
    ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/38/v3/FqE4K3xfSt6BZnvIzxmGEA/zh-cn_image_0000002594829632.png?HW-CC-KV=V1&HW-CC-Date=20260612T073815Z&HW-CC-Expire=86400&HW-CC-Sign=B75F77FFD4BEA809434BEB83283F22DF56DEFB7627EF5A819692FD17E45888FA)
    
4.  **WARN类型导致的ERROR**
    
    **问题详情：**
    
    ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/38/v3/koDhVgOuSz6NED-B_CKPDA/zh-cn_image_0000002625189079.png?HW-CC-KV=V1&HW-CC-Date=20260612T073815Z&HW-CC-Expire=86400&HW-CC-Sign=E92B8F618C3493B83A9A6F6C3BF28F388D31CD46B60170C2A76A5B535F4B3C57)
    
    **问题原因/解决措施：**
    
    编译器驱动程序有时（很少）会在调用之前发出警告。实际的链接器需要确保这些警告是否也被视为致命错误。为了避免编译中出现因警告而造成出错，可以添加编译参数treat\_warnings\_as\_errors = false，或者去除config(treat\_warnings\_as\_errors)中配置的“-Werror”，详情如下：
    
    ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/ac/v3/BHqNtUaSSGmMqcIXdc489w/zh-cn_image_0000002625109223.png?HW-CC-KV=V1&HW-CC-Date=20260612T073815Z&HW-CC-Expire=86400&HW-CC-Sign=D60256489745BA86BD70D8D81FA3F3397C8CC154AC668F69A4032D4F056F9273)
    
    **具体修改：**
    
    *   添加编译指令配置项treat\_warnings\_as\_errors （建议使用）
        
        ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/01/v3/czEU9g4lQ3qd2wcWq4SeVg/zh-cn_image_0000002594669706.png?HW-CC-KV=V1&HW-CC-Date=20260612T073815Z&HW-CC-Expire=86400&HW-CC-Sign=FB645C18FE07360E1AE256C057F86063756382D352B0F12165816C3960A615FD)
        
    *   修改源代码，在build/config/compiler/BUILD.gn中删除以下配置。
        
        ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/da/v3/k7iSPfqmSP2N_-GyCKLnxg/zh-cn_image_0000002594829634.png?HW-CC-KV=V1&HW-CC-Date=20260612T073815Z&HW-CC-Expire=86400&HW-CC-Sign=9F63CDBFACC27E774CD04BAE44AF139B2C6D381F4DFC6BE6B9139AA9C69529A3)
        
5.  **error: reinterpret\_cast from 'pthread\_t' (aka 'unsigned long') to 'rtc::PlatformThreadId' (aka 'int') is not allowed**
    
    **问题详情：**
    
    ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/fa/v3/7yW_WacGTjGNaLwS6JlIZg/zh-cn_image_0000002625189081.png?HW-CC-KV=V1&HW-CC-Date=20260612T073815Z&HW-CC-Expire=86400&HW-CC-Sign=6B6270381A8330E2E0BA0F242F1E2EADA9D901CA7AFF2552F8C9F92CE7BD5B22)
    
    **问题原因/解决措施：**
    
    rtc\_base/platform\_thread\_types.cc未识别到is\_ohos导致内部走错分支导致异常。目前HarmonyOS支持的接口是gettid()，rtc\_base/platform\_thread\_types.cc需要识别到is\_ohos然后调用gettid()。由于当前很多业务模块还未进行识别，暂时需要走linux分支，故需要保留linux的定义。
    
    **具体修改：**
    
    *   首先需要在根目录的BUILD.gn中配置识别HarmonyOS系统的变量is\_ohos：
        
        ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/6d/v3/e1KkFlpJT8utBu_B8bm3iA/zh-cn_image_0000002625109225.png?HW-CC-KV=V1&HW-CC-Date=20260612T073815Z&HW-CC-Expire=86400&HW-CC-Sign=02CB5EA626D96C456A6EA9E9DDCA62F2FA244C433131BDA97929A7E8012A631B)
        
    *   修改rtc\_base/platform\_thread\_types.cc业务代码：
        
        ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/84/v3/D7iPEMwdRkCrd4p892WOcg/zh-cn_image_0000002594669708.png?HW-CC-KV=V1&HW-CC-Date=20260612T073815Z&HW-CC-Expire=86400&HW-CC-Sign=5B6D5F67EAD4169CC1A23BAF50EDB17C99C1A7D8F09D1B31E9C084F8ED11BE65)
        
6.  **fatal error: 'config.h' file not found**
    
    **fatal error: 'sys/queue.h' file not found**
    
    **问题详情：**
    
    ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/56/v3/EPLnX6eoQLOgOZnfwZx2cQ/zh-cn_image_0000002594829636.png?HW-CC-KV=V1&HW-CC-Date=20260612T073815Z&HW-CC-Expire=86400&HW-CC-Sign=DF2041B78EF8D15D441EF37C508D8DA2290ABA3D5861D4BF13AC08123D30C0ED)![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/69/v3/wx1w7MG5QtGia1bUqLn_WA/zh-cn_image_0000002625189083.png?HW-CC-KV=V1&HW-CC-Date=20260612T073815Z&HW-CC-Expire=86400&HW-CC-Sign=720644F46BE730A90C626414AF36B6012C6DB43732F2F3937D36C30175825B95)
    
    **问题原因/解决措施：**
    
    找不到config.h头文件，libevent尚未适配HarmonyOS，需要添加is\_ohos的判断并走linux的文件路径寻找config.h。
    
    找不到'sys/queue.h'文件，HarmonyOS SDK中没有queue.h头文件，需要使用compat dir目录下的queue.h头文件。
    
    **具体修改：**
    
    修改third\_party/libevent中的BUILD.gn。
    
    ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/1f/v3/DT-QOyJhSMGkjI_b7ncWog/zh-cn_image_0000002625109227.png?HW-CC-KV=V1&HW-CC-Date=20260612T073815Z&HW-CC-Expire=86400&HW-CC-Sign=5B2E3F0625CA0C1B1292A109DAC538188179775DF43E884E8573D003A7AE98FA)