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)
希望对您有所帮助。
我使用 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)
希望对您有所帮助。