HarmonyOS鸿蒙Next原生Openharmony5.0代码编译报错

HarmonyOS鸿蒙Next原生Openharmony5.0代码编译报错 原生openharmony5.0代码,在build-type为debug的时候,编译链接third_party/abseil-cpp时,出现build error,报错为

ld.lld: error: undefined symbol:absl::lts_20220623::raw_logging_internal::RawLog(absl::lts_20220623::LogServerity, char const*. int, char const*, …)

referenced by call_once.h:157 (…/…/third_party/abseil-cpp/abseil-cpp/absl/base/call_once.h:157)


更多关于HarmonyOS鸿蒙Next原生Openharmony5.0代码编译报错的实战教程也可以访问 https://www.itying.com/category-93-b0.html

10 回复

难道openharmony的源代码都不会编译profile和debug的版本吗,这版本发布的也太敷衍了吧。

更多关于HarmonyOS鸿蒙Next原生Openharmony5.0代码编译报错的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


我看OH 滚动构建上面 5.0.0、5.1.0 是可以编译出来镜像的。是不是本地环境有问题?

或者你再拉一套5.1.0的,如果还是不能编译成功,可能就是本地环境的问题了

每日构建 | OpenHarmony CI

cke_3005.png

我说过了,是debug版本或者profile版本,当配置这两个build-type之后,third-party的组件还有一些系统配置和release版本是不同的。我本地编译release版本也能正常编译成功。

这个现象大概率不是 OpenHarmony 5.0 本身坏了,而是:

debug 模式下 Abseil 走到了额外的断言/日志代码路径,但你的最终链接没有把对应的 Abseil 实现库一起带上。

为什么只在 debug

你这个未定义符号是:

  • absl::lts_20220623::raw_logging_internal::RawLog(...)

而报错位置在:

  • absl/base/call_once.h

这类符号通常不是纯头文件能力,而是 Abseil 的内部日志/断言实现

release 下很多检查会被裁掉或弱化;
debug 下会启用更多 CHECK / RAW_CHECK / ASSERT 路径,所以才会把 RawLog 真正引用出来,最后一链接就炸。

根因判断

本质上是两类问题之一:

1. 少链了 Abseil 的实现库

你现在大概率只引了:

  • 头文件
  • 或部分 absl 静态库

没有把 RawLog 所在库一起链接进来

这个库通常和这些模块有关:

  • raw_logging_internal
  • base
  • spinlock_wait
  • synchronization

具体名字要以你当前 third_party/abseil-cpp 里的 BUILD.gn/CMakeLists.txt 为准。

2. 静态库链接顺序/分组有问题

如果你是静态链接 .a,即使库有,也可能因为:

  • 顺序不对
  • 没做 group
  • 没加 whole archive

导致 RawLog 没被拉进最终产物。

为什么这个判断比较稳

OpenHarmony 官方对 undefined symbol 的通用结论也是:

先怎么改

如果你是 GN 构建

不要只 include 头文件或只依赖上层一两个 target,建议把 call_once 所需的底层依赖补齐。

思路类似:

deps = [
  "//third_party/abseil-cpp/absl/base:base",
  "//third_party/abseil-cpp/absl/base:raw_logging_internal",
  "//third_party/abseil-cpp/absl/base:spinlock_wait",
  "//third_party/abseil-cpp/absl/synchronization:synchronization",
]

如果你已经依赖了某个更高层 target,但仍然缺符号,说明:

  • 那个 target 没把依赖透传出来
  • 或最终链接阶段没把静态库真正带进去

这时要继续查最终可执行/so 的 deps/public_deps

如果你是 CMake 构建

思路也是一样,别只引头文件,要把库补全:

target_link_libraries(your_target
    absl_base
    absl_raw_logging_internal
    absl_spinlock_wait
    absl_synchronization
)

名字未必完全一致,但核心是:

  • RawLog 对应的实现库必须参与最终链接

还要重点检查这两点

1. 不要把 Abseil 当纯头文件库用

call_once.h 看起来像头文件,但它内部依赖的很多实现并不是 header-only。

所以不能因为代码里只 #include <absl/base/call_once.h>,就以为只要头文件路径对了就够了。

2. Debug/Release 的编译宏要一致

如果你项目里某些目标:

  • 一部分按 debug
  • 一部分 Abseil 静态库却按另一套宏编

也可能导致行为不一致。

尤其要看:

  • NDEBUG
  • ABSL_MIN_LOG_LEVEL
  • 以及你是否对 Abseil 做过裁剪宏

最常见修复方式

我建议你按这个顺序排:

  1. 找到 RawLog 实际在哪个 Abseil target 里定义
  2. 确认这个 target 有没有加入最终目标的链接依赖
  3. 如果是静态库,确认链接顺序/分组是否正确
  4. 对比 debugrelease 的依赖差异
  5. 不要只依赖 call_once.h 的头文件路径

一个很像你这个场景的规律

你这类报错如果是:

  • release 能过
  • debug 才炸
  • 符号是 RawLog

那十有八九就是:

debug 打开了 Abseil 的校验路径,但你没把 raw_logging_internal 那条库链带进来。

我给你的直接建议

先去你工程里搜:

  • raw_logging_internal
  • absl/base/BUILD.gn
  • RawLog(

确认 RawLog 属于哪个 target,然后把那个 target 明确加到最终产物依赖里。

这种未定义符号,链接错误,就是有函数声明,但链接时找不到定义。

看不到你的配置(CMake构建为例),只能给你个大体排查方向:

  1. 先做简单操作的。清理和重新生成构建文件。

  2. 如果其他编译环境(如release)下,可以编译成功,那就对比配置不同的地方,全文搜absell找不同。

  3. 如果absell用的源码,IDE全文搜absell或RawLog,找到定义实现的文件,确认是否参与编译了。

  4. 如果用的静(动)态库,确保库在CMakeLists.txt里正确引入了。

这种问题,看不到你的环境和工程,除非和你遇到过一模一样的情况并解决过了,才能准确回答你。

还有几点排查,参考下这个:《CPP编译报错》

找HarmonyOS工作还需要会Flutter的哦,有需要Flutter教程的可以学学大地老师的教程,很不错,B站免费学的哦:https://www.bilibili.com/video/BV1S4411E7LY/?p=17

修改:

third_party/abseil-cpp/absl/base/BUILD.gn

找到相关 target:

可能类似:

ohos_static_library(“base”)

或:

source_set(“base”)

确保加入:

internal/raw_logging.cc

OpenHarmony相关的问题可以去laval社区交流哦

编译报错通常由于OpenHarmony 5.0的构建环境配置不当,如工具链版本(hb、gn、ninja)与SDK不匹配,或依赖库缺失。此外,引用已废弃的API、模块路径错误、权限配置文件未更新也会导致失败。请检查项目根目录下的build.log或编译控制台输出的具体错误行,定位到具体模块或文件。

这个链接错误是因为 call_once.h 中调用了 RawLog 函数,但链接时找不到该符号。该符号属于 Abseil 的内部日志库 absl_raw_logging_internal。在 OpenHarmony 5.0 原生 debug 构建中,可能是目标依赖未正确声明,或 Abseil 的部分源码未参与编译。

解决方法:检查引用 call_once.h 的目标(通常是 absl_base 或直接使用它的模块)的 BUILD.gn,确保显式添加 "//third_party/abseil-cpp:absl_raw_logging_internal" 依赖。

回到顶部