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
先说一下原因,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
开发的人都会踩的坑。
你现在的问题主要有两个:
.clangd被覆盖- 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 坏了。
而是:
- DevEco 会自动覆盖
.clangd - clangd 实际依赖 compile_commands
- 你没有真正 include openharmony sysroot
- DevEco 默认偏向 hms/native
- 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 很容易被下一次同步覆盖。
更建议从构建输入侧解决:
- 在 CMakeLists.txt 里用 target_include_directories 给目标补充 include 路径。
- 确认当前 product/buildMode/ABI 对应的 .cxx 目录是你正在看的那一份。
- 清理后重新 Sync/Build,再看生成的 compile_commands.json 是否包含目标路径。
- 如果是 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 补充通用标志(该文件通常不会被覆盖)。

