我正在努力用libclang和python解析cpp文件。
问题是,当我不声明类foo
时,libclang会忽略它发现testString
和main()
的功能。
//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文件中解析这些函数和变量的方式。
答案 0 :(得分:0)
您使用什么作为CMake的后端工具?只是普通的make
吗?如果是这样,您可以使用make -n
来获取要执行的命令列表;它们将包含必要的-I /header/locations
标志。
您无法真正解析C ++代码的片段。甚至人类都对此有疑问,因此我们希望在StackOverflow上完整编译源代码。例如,您假设test1
是class
。但是,如果它是union
怎么办? (Yes, a union
can have methods)。定义中还缺少的是virtual
是什么类型的方法。