我使用 Clang python 绑定来提取 c/c++ 文件的 AST。它非常适合我编写的一个简单程序。问题是当我想将它用于像 openssl 这样的大项目时。我可以为项目的任何单个文件运行 clang,但 clang 似乎错过了项目的一些标头,并且只提供了文件的一些函数的 AST,而不是所有函数。我通过-I设置了包含文件夹,但仍然获得部分功能。
这是我的代码:
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)
我收到太多头文件未找到错误。
UPDATE
我用Make通过clang编译openssl?我可以将 -emit-ast 选项传递给 clang 来转储每个文件的 ast,但我现在无法通过 clang python 绑定读取它。
有什么线索可以保存翻译单元的序列化表示,以便我能够通过 index.read() 读取它吗?
谢谢你!
您“简单地”需要提供正确的args
。但请注意两个可能的问题。
不同的文件可能需要不同的参数进行解析。最简单的解决方案是获取编译数据库 https://clang.llvm.org/docs/JSONCompilationDatabase.html然后从中提取编译命令。如果你这样做,请注意你需要过滤掉一些参数并删除诸如-c FooBar.cpp
(可能还有其他一些),否则你可能会得到类似 ASTReadError 的东西。
另一个问题是包含路径(-I ...
) 可能相对于源目录。即,如果一个文件main.cpp
从目录编译/opt/project/
with -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)
我希望它有帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)