HarmonyOS鸿蒙Next中c++代码提示问题

HarmonyOS鸿蒙Next中c++代码提示问题 当我尝试使用项目根目录下的.clangd设置compile_commands.json的路径,保存文件,重新打开deveco时,它的同步数据进程或索引进程会把.clangd文件重新覆盖一遍,之前的内容全部丢失。

所以目前clangd的代码提示功能只能支持D:\DevEco_Studio\sdk\default\hms\native\sysroot\usr\include目录下的文件索引,却并不支持在D:\DevEco_Studio\sdk\default\openharmony\native\sysroot\usr\include目录下的索引,以下是compile_commands.json的文件内容:

[
{
  "directory": "C:/dev/project/deveco_studio/first/products/entry/.cxx/default/default/debug/x86_64",
  "command": "C:\\dev\\IDE\\DevEco_Studio\\sdk\\default\\hms\\native\\BiSheng\\bin\\clang++.exe --target=x86_64-linux-ohos --gcc-toolchain=C:/dev/IDE/DevEco_Studio/sdk/default/hms/native/BiSheng --sysroot=C:/dev/IDE/DevEco_Studio/sdk/default/openharmony/native/sysroot -Dentry_EXPORTS -IC:/dev/IDE/DevEco_Studio/sdk/default/hms/native/sysroot/usr/include -IC:/dev/project/deveco_studio/first/products/entry/src/main/cpp -IC:/dev/project/deveco_studio/first/products/entry/src/main/cpp/include -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -fno-addrsig -Wa,--noexecstack -Wformat -Werror=format-security   -D__MUSL__ -O0 -g -fno-limit-debug-info  -fPIC -o CMakeFiles\\entry.dir\\napi_init.cpp.o -c C:\\dev\\project\\deveco_studio\\first\\products\\entry\\src\\main\\cpp\\napi_init.cpp",
  "file": "C:\\dev\\project\\deveco_studio\\first\\products\\entry\\src\\main\\cpp\\napi_init.cpp",
  "output": "CMakeFiles\\entry.dir\\napi_init.cpp.o"
}
]

另外是否有相关设置能设置clangd的启动进程参数或者配置之类的功能?感谢回答!


更多关于HarmonyOS鸿蒙Next中c++代码提示问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html

8 回复

先说一下原因,DevEco Studio 的同步/索引进程在检测到项目配置变更时,可能会自动重新生成 .clangd文件,导致你手动添加的配置丢失。

解决建议:

将 clangd 配置改为使用 .clangd/config.yaml文件(在项目根目录创建 .clangd文件夹,并在其中创建 config.yaml)。这种方式通常不会被 IDE 自动覆盖。

如果问题依旧,可以尝试在 DevEco Studio 的设置中关闭“自动同步 C/C++ 配置”选项(具体路径:File > Settings > Languages & Frameworks > C/C++ > Clangd,查找相关同步设置)。

更多关于HarmonyOS鸿蒙Next中c++代码提示问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


你这个问题本质上其实是:

DevEco Studio 对 .clangd 有“自动生成/自动覆盖”行为,导致你手动配置的 clangd 设置被 IDE 重置了。

而且目前 DevEco 的 C++ 索引体系,本身对:

openharmony/native/sysroot

支持是不完整的。

这是很多做:

  • NAPI
  • OpenHarmony Native
  • OH_NativeXxx
  • libc++
  • system capability

开发的人都会踩的坑。

你现在的问题主要有两个:

  1. .clangd 被覆盖
  2. openharmony sysroot 无法索引

先说第一个。

你现在:

项目根目录/.clangd

会被 DevEco 自动同步进程覆盖。

这是因为:

DevEco Studio 内置了:

  • CMake Sync
  • Native Sync
  • Clangd Sync
  • Compilation Database Sync

启动时会重新生成 clang 配置。

所以:

你手动改 .clangd

=> IDE启动

=> 自动覆盖

这是 DevEco 当前行为,不是你配置错了。

目前比较稳定的解决方案有几个:

方案1(推荐):

不要改 .clangd

而是:

改:

compile_commands.json

中的 includePath。

因为:

clangd 真正索引的核心来源其实是:

compile_commands.json

你现在虽然:

--sysroot=openharmony/native/sysroot

已经存在。

但:

你真正 include 的只有:

-I.../hms/native/sysroot/usr/include

并没有:

-I.../openharmony/native/sysroot/usr/include

所以 clangd 根本不会主动索引 OH 的头文件。

你需要额外加:

-IC:/dev/IDE/DevEco_Studio/sdk/default/openharmony/native/sysroot/usr/include

也就是:

你的 command 里应该同时存在:

-Ihms/native/sysroot/usr/include
-Iopenharmony/native/sysroot/usr/include

否则:

OH_NativeXxx 系列很多都不会补全。

这是核心问题。

你现在的 sysroot:

--sysroot=...

只是编译器运行时路径。

不等于 clangd 索引路径。

clangd 更依赖:

-I

参数。

这是很多人误解的地方。

第二个问题:

为什么 .clangd 会被覆盖?

目前 DevEco 对:

.clangd

支持其实并不完整。

尤其:

  • Native工程
  • HarmonyOS工程
  • hvigor同步

过程中,

IDE 会重建配置。

目前社区很多人都是:

不用 .clangd

而改:

CMakeLists.txt

例如:

include_directories(
    ${OHOS_NDK}/sysroot/usr/include
)

让 compile_commands 自动生成正确 include。

这是目前最稳定方式。

第三个问题:

clangd 启动参数能不能配置?

目前 DevEco Studio:

基本没有开放 GUI 配置入口。

不像:

  • VSCode
  • CLion

可以直接:

clangd.arguments

所以:

--background-index
--query-driver
--header-insertion

这些,

DevEco 目前很难直接改。

不过可以尝试:

Help → Edit Custom VM Options

但这个主要是 JVM,

不是 clangd。

目前 DevEco 的 clangd 配置基本是内置的。

第四个问题(重点):

openharmony/native/sysroot 为什么不补全?

这个其实是:

HarmonyOS SDK 的“双sysroot结构”。

现在 DevEco 有:

hms/native/sysroot
openharmony/native/sysroot

其中:

hms/native

偏:

  • HMS API
  • AGC
  • 华为扩展

而:

openharmony/native

偏:

  • OpenHarmony Native API
  • libc
  • system capability
  • OH_NativeXXX

但 DevEco 默认更偏向:

hms/native

所以:

openharmony 那边很多头文件:

  • 不自动索引
  • 不自动补全
  • 跳转失效

目前很多人都遇到。

最后给你一个目前最实用方案:

直接在:

target_include_directories()

里加:

${OHOS_SDK}/openharmony/native/sysroot/usr/include

然后:

Build -> Clean Project
Build -> Rebuild

重新生成:

compile_commands.json

效果通常比硬改 .clangd 稳定得多。

最后总结一下:

你现在的问题不是 clangd 坏了。

而是:

  1. DevEco 会自动覆盖 .clangd
  2. clangd 实际依赖 compile_commands
  3. 你没有真正 include openharmony sysroot
  4. DevEco 默认偏向 hms/native
  5. clangd 参数目前 DevEco 几乎没开放配置入口

目前 HarmonyOS Native 开发里,

这算是比较经典的坑。

感谢您的回复,先说以下,我的deveco下载的是API22版本的,即6.0.2。我也尝试了您说的target_include_directories,但在加上路径后,清理项目,重建项目然后看copile_commands.json仍然是原来的路径,对于openharmony的路径并没有加上。看了.cxx/default/default/debug/x86_64或者arm64-v8a等都是一样的情况,这个路径又被.idea/.deveco/cxx/compile_commands.json引用,项目实际编译看的是.idea路径下的compilie_commands.json文件。

还有一旦cmakelists.txt文件发生改动,同步后相应的compile_commands.json又会重新覆盖。

我暂且的实现也只能是在用户目录下的.clangd/config.yaml配置增加相应字段。

DevEco/Hvigor 生成 native 索引时会接管 .cxx 和部分 clangd 配置,直接改自动生成的 .clangd 或 compile_commands.json 很容易被下一次同步覆盖。

更建议从构建输入侧解决:

  1. 在 CMakeLists.txt 里用 target_include_directories 给目标补充 include 路径。
  2. 确认当前 product/buildMode/ABI 对应的 .cxx 目录是你正在看的那一份。
  3. 清理后重新 Sync/Build,再看生成的 compile_commands.json 是否包含目标路径。
  4. 如果是 openharmony/native/sysroot 的头文件,确认使用的 SDK 包和 native toolchain 本身包含该 sysroot。

手写 compile_commands.json 只能临时改善编辑器提示,最终还是要让 CMake/Hvigor 生成出正确命令,否则 IDE 同步后会回到旧状态。

可以参考下这个《使用Clang-Tidy检测》
看是否能满足你配置到clangd的需求。

是不是要创建openharmony项目才行,默认只能识别hms的

idea.properties不知道能不能修改成功

在HarmonyOS Next中,C++代码提示异常可能因IDE索引未及时更新、C++插件未正确加载,或.cpp文件未被识别为源码资源导致。请检查项目.cxx目录配置及build-profile.json5中C++源文件路径声明是否完整。

.clangd 配置文件被覆盖是 DevEco Studio 同步工程时的内置行为,不建议手动维护 .clangd。让 clangd 正确索引 OpenHarmony 头文件的最佳方式是从源头解决问题:修改 CMake 配置,让自动生成的 compile_commands.json 包含所需的 include 路径。

在你的 CMakeLists.txt 中,为 entry 目标添加如下指令(根据实际 SDK 路径调整):

target_include_directories(entry PRIVATE
    # 已有的 hms 路径
    "${OHOS_SDK_NATIVE}/sysroot/usr/include"
    # 需要补充的 OpenHarmony 路径
    "D:/DevEco_Studio/sdk/default/openharmony/native/sysroot/usr/include"
)

保存后重新触发一次“Build > Refresh Linked Projects”或执行一次编译,即可更新 compile_commands.json,clangd 随后便会索引这些路径。

关于 clangd 启动参数,当前 DevEco Studio 未提供直接配置项。如需额外定制,可尝试在工程根目录放置 .clangd 文件但极易被重置;更稳妥的做法是通过 CMake 变量(如 CMAKE_CXX_FLAGS = "-Xclang -fmodules")间接影响 clangd 行为,或利用 compile_flags.txt 补充通用标志(该文件通常不会被覆盖)。

回到顶部