Clang 用叮当声宣布一个项目

Clang 用叮当声宣布一个项目,clang,llvm,abstract-syntax-tree,Clang,Llvm,Abstract Syntax Tree,我使用铿锵python绑定来提取c/c++文件的AST。对于我编写的一个简单程序来说,它非常有效。问题是当我想将它用于像openssl这样的大型项目时。我可以为项目的任何单个文件运行clang,但是clang似乎遗漏了项目的一些标题,只提供了文件中一些函数的AST,而不是所有函数的AST。我通过-I设置了include文件夹,但仍然得到了部分函数 这是我的代码: import clang.cindex as cl cl.Config.set_library_path(clang_lib_

我使用铿锵python绑定来提取c/c++文件的AST。对于我编写的一个简单程序来说,它非常有效。问题是当我想将它用于像openssl这样的大型项目时。我可以为项目的任何单个文件运行clang,但是clang似乎遗漏了项目的一些标题,只提供了文件中一些函数的AST,而不是所有函数的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)
我收到太多未找到的头文件错误

更新

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

有什么线索可以告诉我如何保存翻译单元的序列化表示,以便我能够通过index.read()读取它吗

谢谢大家!

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

不同的文件可能需要不同的参数进行解析。最简单的解决方案是获取并从中提取编译命令。如果您这样做,请注意您需要过滤掉一些参数,并删除类似
-cfoobar.cpp
(可能还有其他一些)的内容,否则您可能会得到类似ASTReadError的结果

另一个问题是include路径(
-I…
)可能与源目录相关。也就是说,如果一个文件
main.cpp
是用
-I include/path
参数从目录
/opt/project/
编译而成,那么在调用
index.parse(source_file,args=args)
之前,您需要在
/opt/project
中插入(
chdir
),完成后,您可能需要返回原始工作目录。因此代码可能如下所示(伪代码):


我希望它能有所帮助。

您使用什么命令来获取简单程序的AST?我更新了我的帖子,添加了我的代码。谢谢,Alex!我进行了差不多相同的结构。我用Make编译了这个项目。然后它为每个c文件提供一个.d文件,其中包含include路径。然后,我使用了铿锵python绑定,并使用-I选项将这些路径传递给args。我现在可以分别获得所有文件的AST。
cwd = getcwd()
chdir('/opt/project')
translation_unit = index.parse(source_file, args=args)
chdir(cwd)