用 VS code 的微软官方 "C/C++" 插件开发大型 C 语言项目,如何根据文件或目录列表来生成 tag 数据库?

2021-12-26 20:40:31 +08:00
 kgdb00
昨天我也问了这个问题( "https://v2ex.com/t/824400"),可能是因为我没有描述清楚,最终没有得到满意的解决,今天再问一次。

用 vs code 的微软官方 "C/C++" 插件导航像 Linux 内核这样的大型项目最大的问题是生成 tag 的时间太长,tag 文件占用磁盘空间太大,而大部分源码文件是没有必要生成 tag 的,想知道怎么针对特定文件或目录列表来生成 tag 。

昨天帖子的回答中有几位老哥教我用 cmake 或 bear 工具生成一个 compile_commands.json 文件,用这个文件指定要生成 tag 的文件,我把这个文件配置到 c_cpp_properties.json 文件里,结果不生效,"C/C++" 插件还是为所有的源文件生成了 tag 。

微软官方的这个 "C/C++" 插件还有没有其它指定(或排除一些)需要生成 tag 的文件或目录的方式?
1295 次点击
所在节点    程序员
7 条回复
kgdb00
2021-12-26 20:43:36 +08:00
我的 c_cpp_properties.json 文件的配置如下:

{
"configurations": [
{
"name": "Linux",
"includePath": [
"${workspaceFolder}/**",
"${workspaceFolder}/include/"
],
"defines": [],
"compilerPath": "/usr/lib64/ccache/gcc",
"cStandard": "gnu17",
"cppStandard": "gnu++17",
"intelliSenseMode": "linux-gcc-x64",
"compileCommands": "${workspaceFolder}/compile_commands.json"
}
],
"version": 4
}

不知道是不是我配置错误所以才没有生效。
kgdb00
2021-12-26 21:43:13 +08:00
没人回复,自己顶一下
hhjuteman
2021-12-27 09:48:24 +08:00
我的建议是不要用 compile_commands.json 。

这类工具都是基于 clang ast macher 或者 libclang 做出来的符号索引工具。compile_command 是一个编译记录的数据库,ast_matcher 读到数据库以后会对语法进行 ast 树解析并生成文件,Linux kernel 代码太大,ast 匹配占用的 cpu 时间太长。

使用 clangd 会因为符号太多导致索引崩溃,这个也很正常。如果电脑性能不是特别好我建议使用传统的 gtags 或者 ctags 来阅读 Linux kernel 的源码。我以前用笔记本的时候从来没有用 compile_commands 的方式成功阅读过 kernel 源码,现在用台式机了,用 compile_commands 阅读过 chromium 的源码,不过我电脑的性能特别高。

所以我还是建议使用 tags 的方式, 我这里用搜索了一下,不知道有没有用:
https://blog.jaycetyle.com/2018/10/vscode-gnu-global/
kgdb00
2021-12-27 10:24:42 +08:00
@hhjuteman 感谢回复!

试了一下这个 C/C++ GNU Global 插件,感觉没什么问题,不过在我的配置下编译内核所需的源码文件只有一千多个,
如果有个办法能让微软官方的这个 "C/C++" 插件根据特定的文件列表来生产索引,各方面性能应该也是满足的。
hhjuteman
2021-12-27 10:29:35 +08:00
@kgdb00
您可以试试 clangd 这个插件,是 clang 官方出的,也是配置 compile command 。

使用之前需要先安装 clangd 。apt install clangd 之类的
kgdb00
2021-12-27 11:37:59 +08:00
@hhjuteman clangd 插件试了一下,发现了一个很严重的 bug ,我有多个内核的源码目录,checkout 不同的版本,结果跳转时会跳转到其他内核目录的对应文件。
而且还不能关闭语法检查,一大堆报错看着难受。
而且这个插件使用人数太少,估计还有不少其他 bug 。
kgdb00
2021-12-27 11:41:33 +08:00
@hhjuteman 我就用 C/C++ GNU Global 插件得了,不折腾了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://tanronggui.xyz/t/824537

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX