V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
kgdb00
V2EX  ›  程序员

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

  •  
  •   kgdb00 · 2021-12-26 20:40:31 +08:00 · 1252 次点击
    这是一个创建于 1088 天前的主题,其中的信息可能已经有所发展或是发生改变。
    昨天我也问了这个问题( "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 的文件或目录的方式?
    kgdb00
        1
    kgdb00  
    OP
       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
        2
    kgdb00  
    OP
       2021-12-26 21:43:13 +08:00
    没人回复,自己顶一下
    hhjuteman
        3
    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
        4
    kgdb00  
    OP
       2021-12-27 10:24:42 +08:00
    @hhjuteman 感谢回复!

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

    使用之前需要先安装 clangd 。apt install clangd 之类的
    kgdb00
        6
    kgdb00  
    OP
       2021-12-27 11:37:59 +08:00
    @hhjuteman clangd 插件试了一下,发现了一个很严重的 bug ,我有多个内核的源码目录,checkout 不同的版本,结果跳转时会跳转到其他内核目录的对应文件。
    而且还不能关闭语法检查,一大堆报错看着难受。
    而且这个插件使用人数太少,估计还有不少其他 bug 。
    kgdb00
        7
    kgdb00  
    OP
       2021-12-27 11:41:33 +08:00
    @hhjuteman 我就用 C/C++ GNU Global 插件得了,不折腾了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3708 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 00:50 · PVG 08:50 · LAX 16:50 · JFK 19:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.