Clang 的一个项目的 AST

AST of a project by Clang

我使用 Clang python 绑定来提取 c/c++ 文件的 AST。它非常适合我编写的一个简单程序。问题是当我想将它用于像 openssl 这样的大项目时。我可以 运行 clang 用于项目的任何单个文件,但 clang 似乎错过了项目的一些 headers,并且只给了我文件的一些函数的 AST,而不是所有的职能。我用-I设置了include文件夹,但还是得到了部分功能

这是我的代码:

import clang.cindex as cl    
cl.Config.set_library_path(clang_lib_dir)
index = cl.Index.create()
lib = 'Path to include folder'
args = ['-I{}'.format(lib)]
translation_unit = index.parse(source_file, args=args)
my_get_info(translation_unit.cursor)

我收到太多 header 找不到文件的错误。

更新

我用Make通过clang编译openssl?我可以将 -emit-ast 选项传递给 clang 以转储每个文件的 ast,但我现在无法通过 clang python 绑定读取它。

关于如何保存翻译单元的序列化表示以便我能够通过 index.read() 阅读它的任何线索?

谢谢!

您 "simply" 需要提供正确的 args。但请注意两个可能的问题。

不同的文件可能需要不同的解析参数。最简单的解决方案是获取 compilation database 然后从中提取编译命令。如果你这样做,请注意你需要稍微过滤掉参数并删除 -c FooBar.cpp 之类的东西(可能还有其他一些),否则你可能会得到类似 ASTReadError.

的东西

另一个问题是包含路径 (-I ...) 可能与源目录相关。即,如果文件 main.cpp 从目录 /opt/project/ 编译而来,带有 -I include/path 参数,那么在调用 index.parse(source_file, args=args) 之前,您需要将 (chdir) 进入 /opt/project,完成后您可能需要返回到原始工作目录。所以代码可能看起来像这样(伪代码):

cwd = getcwd()
chdir('/opt/project')
translation_unit = index.parse(source_file, args=args)
chdir(cwd)

希望对您有所帮助。