Clang 用叮当声宣布一个项目
我使用铿锵python绑定来提取c/c++文件的AST。对于我编写的一个简单程序来说,它非常有效。问题是当我想将它用于像openssl这样的大型项目时。我可以为项目的任何单个文件运行clang,但是clang似乎遗漏了项目的一些标题,只提供了文件中一些函数的AST,而不是所有函数的AST。我通过-I设置了include文件夹,但仍然得到了部分函数 这是我的代码: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_
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)