是否可以使用libclang python

时间:2018-10-08 19:55:29

标签: python c++ libclang

我正在努力用libclang和python解析cpp文件。

问题是,当我不声明类foo时,libclang会忽略它发现testStringmain()的功能。

//test.cpp
std::string test1::foo(){

}

std::string *testString = "";

int main()
{
    return 0;
}

当我在下面的函数原型之前声明test1类时,它将检测到foo函数。

//test.cpp
class test1{
    private:
    std::string foo();
};

std::string test1::foo(){

}

std::string *testString = "";

int main()
{
    return 0;
}

我谦虚的解析器脚本:

import sys
import clang.cindex
clang.cindex.Config.set_library_file('C:/Program Files/LLVM/bin/libclang.dll')
def list_nodes(node):
    for c in node.get_children():
        print("-------------------")
        print(c.spelling)
        print(c.access_specifier)
        print(c.type.kind)
        list_nodes(c)


index = clang.cindex.Index.create()
tu = index.parse("test.cpp")
list_nodes(tu.cursor)

我的项目存在的问题是我正在使用cmake,并且想解析一些cpp文件并从中获取信息。由于我的项目依赖于cmake,大多数时间头文件和源文件不在同一目录中。我不想在其他地方绑定这些文件而造成混乱。有没有实践可以从cmake文件中自动获取标头位置。或者,也可以采用仅在cpp文件中解析这些函数和变量的方式。

1 个答案:

答案 0 :(得分:0)

您使用什么作为CMake的后端工具?只是普通的make吗?如果是这样,您可以使用make -n来获取要执行的命令列表;它们将包含必要的-I /header/locations标志。

您无法真正解析C ++代码的片段。甚至人类都对此有疑问,因此我们希望在StackOverflow上完整编译源代码。例如,您假设test1class。但是,如果它是union怎么办? (Yes, a union can have methods)。定义中还缺少的是virtual是什么类型的方法。