用clang如何将多个c++文件可以生成一个大的ast文件?

cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON path/to/llvm/sources可以生成 compile_commands.json
然后clang怎么用这个文件来生成ast文件吗?如果可以的话,clang这个功能是什么版本开始支持的?
谢谢。

compile_commands.json 文件是用来描述编译过程的 JSON 格式文件。在使用 Clang 分析源代码时,可以通过该文件来指定编译选项,以及编译源文件的命令。Clang 工具可以通过读取 compile_commands.json 文件来获取编译选项和编译命令,然后对源代码进行静态分析。

要使用 compile_commands.json 文件来生成 AST 文件,可以使用 Clang 工具中的 clang-tool。 clang-tool 可以根据 compile_commands.json 文件中的信息来构建代码,生成 AST 文件。

具体来说,可以使用以下命令来生成 AST 文件:

clang-tool -p /path/to/build/folder /path/to/source.cpp

其中,-p 参数指定编译数据库的路径,即 compile_commands.json 所在的路径,/path/to/source.cpp 是需要生成 AST 文件的源文件路径。

Clang 从 3.4 版本开始支持 compile_commands.json 文件。

在使用Clang生成AST时,可以使用clang-check工具,它可以在不生成目标文件的情况下分析源代码并生成AST。同时,也可以使用clang-tidy工具,该工具可以进行代码分析,并使用Clang AST来诊断C++源代码,并提供自动化修复建议。

生成AST的命令示例:


clang-check -ast-dump -extra-arg=-std=c++11 source.cpp -- -I./include

其中,-ast-dump参数指示clang-check生成AST并将其转储到标准输出,-extra-arg参数指示额外的编译参数。

关于compile_commands.json文件,可以在clang-check和clang-tidy命令中使用-p参数指定该文件的路径,以提供编译参数。

clang-check和clang-tidy功能从Clang 3.5版本开始支持。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这篇博客: 一文带你梳理Clang编译步骤及命令中的 3. 查看Clang AST结构 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    我们可以通过如下的命令查看源码的AST结构:

    clang -Xclang -ast-dump -c test.c

    打印出来的AST信息,其实是预处理之后展开的源码信息,源码的AST内容在打印出来的内容的最下面。

    如下面的代码:

    #include <stdio.h>
    
    int main() {
        printf("hello");
        return 0;
    }

    打印出来的部分AST(仅根当前文件内容匹配部分)如下:

    头上的头文件引用等已经展开,没有了,但是下面的 main 函数定义,则如上面的 FunctionDecl 所示,并且给出了 代码中的位置。这里就不详细分析AST的结构了,写几个例子比对一下就很容易理解。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^