LLVM cmake安装无法找到DIA SDK
我正在尝试使用CMAKE构建LLVM安装,但这给了我有关llvm_enable_dia_sdk的错误.我在没有PDB的情况下设法构建了LLVM,但我正试图开始使用Libclang,因此我需要PDB. cmake给我以下错误: cmake/config-ix.cmake上的cmake错误:482(消息): 没有找到DIA SDK.如果您同时安装了VS 2012和2013,则可以 需要卸载前者,然后重新安装后者. 致电堆栈(首先是最近的电话): cmakelists.txt:575(include) 我安装了VS 2014(2015带有更新3),它确实具有直径文件夹.谁能告诉我如何将其指向正确的DIA SDK位置? 解决方案 我今天遇到了同样的问题,克里·塞兹(Kerry Seitz)的答案确实有效. 实际上,环境变量VSINSTALLDIR不必手动设置 - 而是打开开发人员命令提示.它将执行批处理脚本并正确创建VSINTALLDIR.在该提示中运行CMAK
0 2023-11-24
编程技术问答社区
Vim的C族语义自动完成插件(C/C++完成),使用Clang(clang_complete,YouCompleteMe)。
我在Windows上使用64位VIM,版本作者 haroogan : +python27 +python33 +huge 我正在尝试使用但是,当我打开*.cpp文件时,我现在有一条消息: libclang找不到内置包含的,这会导致慢 完成代码 ,但我根本没有完成... 我找到了这篇文章与构建VIM版本的家伙我使用的是,但是没有关于该怎么做的明确指示.有人可以在这里提供帮助吗? 更新 这是我所做的: 服用 vim youcompleteme for Windows 服用从中取走liclang.dll并将其粘在ycm python目录 服用 它几乎可以工作(我没有任何错误消息),但我仍然得到: 解决方案 clang_complete 感谢您使用 for Windows for Windows ,希望你喜欢. 要解决您的问题,您必须使用.clang_complete文件.在:h clang_complete中阅读有关它的更
0 2023-11-19
编程技术问答社区
如何使用libclang的python绑定来跳过AST遍历中的子树
我刚刚开始使用 libclang 通过python bindings.我了解我可以使用get_children遍历整个语法树(AST),但是我无法找到get_next_sibling()(或任何可能被称为)函数,以便我可以跳过不感兴趣的子树.是否存在这样的功能? 解决方案 我认为python API中不存在get_next_sibling函数,但我也不知道为什么需要它. 在Python API中,AST中的每个节点都知道其所有孩子,因此跳过无趣的子树可以通过简单地将它们跳过父母的孩子而轻松完成.从 Eli Bendersky的出色博客有关libclang python api 的帖子: def find_typerefs(node, typename): """ Find all references to the type named 'typename' """ if node.kind.is_reference(): re
8 2023-10-25
编程技术问答社区
Windows上的python libclang绑定无法从sublime text初始化翻译单元
简短描述:使用libclang对自动完成代码不适用于与崇高文本捆绑的python. 详细信息:一个小的可验证示例是在 github 本质上,有一个脚本使用略微更改的cindex.py(与Python 3和Clang 3.8兼容),并从测试源文件中构建了翻译单元.然后它重新计算并尝试完成. 该脚本在使用PowerShell的Python 3.3.5上按预期工作. 将崇高文本3放入包装文件夹中时,会产生错误. Sublime Text 3报告的Python版本为3.3.6.错误: Traceback (most recent call last): File "C:\Program Files\Sublime Text 3\sublime_plugin.py", line 78, in reload_plugin m = importlib.import_module(modulename) File "./python3.3/importlib
10 2023-10-04
编程技术问答社区
如何在STL中使用libclang?
我正在尝试使用libclang解析库,而我陷入了一个非常简单的问题:如何用STL配置它? 目前,它无法解析翻译单元,因为它找不到. 这是我尝试的: char *args[] = {"-x", "c++", "-Ic:/my/library/includes", "-IG:/Prog/libcxx-3.4/include"}; clang_parseTranslationUnit(index, "c:/my/library/test.cpp", args, 4, 0, 0, 0); 我在Windows上,从llvm.org下载了预编译的Clang二进制文件,我尝试了各种STL实现: Visual Studio mingw libcxx 在每种情况下,我都以未知类型的方式. 例如,使用mingw,我有以下错误消息: /mingw/include\wchar.h:221:71: error: unknown type name '_l
6 2023-09-30
编程技术问答社区
检索有关预处理程序指令的信息
我最近开始使用libclang来解析C文件.我遇到的问题是,显然,Libclang在生成AST之前先启动预处理器.我想禁止预处理器运行,而是要向预处理器指令在文件中的信息... 我使用以下python脚本(cindex.py和libclang) import codecs from clang.cindex import * class SourceFile(object): def __init__(self, path): with codecs.open(path, 'r', 'utf-8') as file: self.file_content = file.read() index = Index.create() root_node = index.parse(path) for included in root_node.get_includes():
12 2023-08-28
编程技术问答社区
如何在llvm clang(7.0.1版)的python绑定下使用compile_commands.json?
我试图在给定的C ++文件中打印出所有AST节点.我提供了一个有效的C ++文件,该文件在其父目录中具有compile_commands.json文件.所有步骤都像 . 目标:X86_64-PC-WINDOWS-MSVC 线程模型:POSIX installeddir:c:\ program Files \ llvm \ bin".OS是Windows10,Python版本为2.7.但是,当我在下面运行此脚本时. 在此处输入代码 import clang.cindex from clang.cindex import * libclang_path = r'C:\Program Files\LLVM\bin\libclang.dll' if Config.loaded == True: pass else: Config.set_library_file(libclang_path) def node_info(node): return {'
12 2023-07-06
编程技术问答社区
使用libclang进行函数边界识别
我正在学习使用python+ libclang解析C ++文件,并借助这个非常有用的(但过时的)教程, eli bendersky . 我的目标是解析C ++文件并确定这些文件中存在的函数的功能边界.我希望能构建此形式的Python词典: {:(, ), ...} 为此,我能够获取函数名称(使用cursor.spelling cursor.spelling用于CursorKind.FUNCTION_DECL或CursorKind.CXX_METHOD类型的AST节点)和开始位置(使用cursor.location) 我的问题是,我如何获得功能的终止位置 解决方案 您正在寻找extent extent extent类上的属性.例如: s = ''' void f(); void g() {} void f() {} ''' idx = clang.cindex.In
14 2023-07-03
编程技术问答社区
libclang:添加编译器系统包含路径(Windows中的Python)。
遵循此问题和 Andrew's 建议,我试图让 liblang 补充编译器系统(在Windows中),以便我的Python代码 import clang.cindex def parse_decl(node): reference_node = node.get_definition() if node.kind.is_declaration(): print(node.kind, node.kind.name, node.location.line, ',', node.location.column, reference_node.displayname) for ch in node.get_children(): parse_decl(ch) # configure path clang.cindex.Config.set_library_file('C
10 2023-07-02
编程技术问答社区
Python clang不搜索系统包含路径
当使用Python的Libclang时,它似乎不会自动搜索系统包含路径. 有没有可靠的方法来获取这些路径?我不喜欢硬编码路径,因为我正在编写将在各种Unix系统上运行的代码. 例如,给定的test.cpp #include int main() { puts("Hello, world!"); } 和test.py from clang.cindex import Index tu = Index.create().parse(None, ["test.cpp"]) print(list(tu.diagnostics)) 运行python test.py将打印: [, spelling "'stdio.h' file not found">] 当然,
30 2023-07-02
编程技术问答社区
使用python libclang检索注释
在以下标头文件中,我想将相应的+reflect注释给类和成员变量: : #ifndef __HEADER_FOO #define __HEADER_FOO //+reflect class Foo { public: private: int m_int; //+reflect }; #endif 使用libclang的python绑定和以下脚本: import sys import clang.cindex def dumpnode(node, indent): print ' ' * indent, node.kind, node.spelling for i in node.get_children(): dumpnode(i, indent+2) def main(): index = clang.cindex.Index.create() tu = index.parse(
10 2023-07-01
编程技术问答社区
用libclang寻找匿名枚举
是否有一种方法可以使用libclang检测匿名枚举而不依赖拼写名称中的文本? Python结合到 以下样本演示了问题. import sys from clang.cindex import * def nodeinfo(n): return (n.kind, n.is_anonymous(), n.spelling, n.type.spelling) idx = Index.create() # translation unit parsed correctly tu = idx.parse(sys.argv[1], ['-std=c++11']) assert(len(tu.diagnostics) == 0) for n in tu.cursor.walk_preorder(): if n.kind == CursorKind.STRUCT_DECL and n.is_anonymous(): print nodeinfo(
30 2023-06-30
编程技术问答社区
用libclang寻找匿名枚举
是否有一种方法可以使用libclang检测匿名枚举而不依赖拼写名称中的文本? Python结合到 以下样本演示了问题. import sys from clang.cindex import * def nodeinfo(n): return (n.kind, n.is_anonymous(), n.spelling, n.type.spelling) idx = Index.create() # translation unit parsed correctly tu = idx.parse(sys.argv[1], ['-std=c++11']) assert(len(tu.diagnostics) == 0) for n in tu.cursor.walk_preorder(): if n.kind == CursorKind.STRUCT_DECL and n.is_anonymous(): print nodeinfo(
38 2023-06-30
编程技术问答社区
如何用libclang检索完全限定的函数名?
我需要解析C ++代码文件,并以完全合格的名称找到其中的所有函数调用.我正在使用Libclang的Python绑定,因为它似乎比编写自己的C ++解析器容易,即使文档很少. . 示例C ++代码: namespace a { namespace b { class Thing { public: Thing(); void DoSomething(); int DoAnotherThing(); private: int thisThing; }; } } int main() { a::b::Thing *thing = new a::b::Thing(); thing->DoSomething(); return 0; } python脚本: import clang.cindex import sys def find_function_calls(node)
18 2023-06-27
编程技术问答社区
如何使用clang API解析一个函数指针的typedef,以获得函数指针的名称?
我目前正在使用Clang C API为C ++代码构建解析器.解析器将处理一个标头文件并生成其定义和缺失符号的列表(忽略包括指令,因此它将严格地分析标头的内容).我的问题是,如果我有一个typedef用于功能指针,该指针的参数不确定类型,例如: typedef SOME_TYPE (* funcPtrName)(SOME_UNDEF_TYPE x); AST解析SOME_TYPE作为Typedef而不是funcPtrName.如果我用SOME_UNDEF_TYPE替换int,它可以正确解析funcPtrName 我以为我可以使用clang_tokenize来获取光标的所有令牌并手动获取函数指针名称,但是在光标上呼叫clang_getCursorExtent指向typedef的光标> clang_getCursorExtent无法正常工作(返回的范围为0,0,范围为0, 0). 您知道解决这个问题吗? 解决方案 我确实通过构建翻译单元中所有令牌的列表并将其传递
34 2023-05-20
编程技术问答社区
由Libclang的python绑定生成的AST无法解析C++源代码中的某些符号
我正在使用Libclang的Python绑定.我基本上有两个查询: 我想知道如何解析既不由用户定义的库或包含库的库函数. 例如当我有以下源代码时 - char* a=(char *)malloc(4); libclang无法解析malloc(),因为该代码均未包含stdlib,也没有为malloc提供用户定义的定义. libclang的AST未识别未使用构造函数定义的对象.例如,在源代码中 - vector color; color.push_back(1); color.push_back(2); push_back()语句不会被解析,但是在这样写时: vector color=new vector(); color.push_back(1); color.push_back(2); 它正确解析. 此行为的另一个令人惊讶的表现是当将这些对象作为函数参数传递给用
28 2023-05-20
编程技术问答社区
在Mac 10.6.8上安装libc++
我目前正在尝试在Mac上安装lib ++.1.dylib.我在此处遵循说明 http://libcxx.llvm.org/并下载了来源.当我尝试./buildit时,我遇到了clang++: command not found错误. 所以我去了这里 http://clang.llvm.org/get_started.html 安装的clang.不幸的是,现在回到安装libcxx时,我仍然遇到了clang ++错误. clang本身可以用clang --help提出帮助菜单. 安装Xcode不是一个选项,因为我正在运行10.6.8. 如何继续即可使clang ++命令工作? 解决方案 在GitHub中有10.6上的libc ++有一个指令 https://github.com/llvm-mirror/libcxxx/libcxx/tree/tree/apple 要在Mac OS X 10.6上构建,您需要找到一个辅助库和标头 这里. cp cxxabi.h
62 2023-05-15
编程技术问答社区
获取定义在不同文件中的函数定义的Libclang API
假设我有两个文件main.c and func.c func.c从main.c的主函数中调用.通常,我会生成main.o and func.o和链接器,并将其定义为func,并将其与Main .c 中的调用联系起来 现在,我想通过libclang apis做同样的事情.这是针对我正在制作的Doxygen类型代码浏览实用程序.我能够解析两个文件.从这里开始,我不知道该如何进行. 我应该生成 *.o文件并制作clang链接吗? 谢谢,我希望我清楚地问这个问题 解决方案 否,无需将您的代码实际编译到对象文件中. 可以使用USR(统一符号分辨率)建立两个翻译单元中符号之间的链接.当您在翻译单元的AST中找到一个有趣的位置(在libclang中以CXCursor表示)时,请致电clang_getCursorUSR()获取关联的USR. 如果两个CXCursor具有相同的USR,即使在两个不同的翻译单元中,它们也与同一符号相关联.
12 2023-03-23
编程技术问答社区
如何在libclang c++中用递归ASTVvisitor提取注释并与声明匹配?
我正在编写一个可以解析C ++(和C)标头文件的实用程序,提取结构,枚举,字段等,并根据提取的信息以其他语言生成代码.我决定使用libclang. 我正在使用RecursiveASTVisitor,似乎我能够提取所需的所有信息,除了评论. 我想在我以其他语言生成代码时读取并添加其文本的每个声明(字段,结构,类,枚举)上方出现的评论. 问题在于,我看到的所有使用注释的样本都使用CxCursor和clang的C接口,我不知道如何在上下文中获得CxCursor. 所以 - 如何在使用RecursiveASTVisitor时如何提取注释? 解决方案 随着更多的挖掘,我发现了这一点: 对于任何相关访问的dect(VisitXXXDecl),我可以做到这一点: virtual bool VisitDecl(Decl* d) { ASTContext& ctx = d->getASTContext(); SourceManager& sm =
164 2023-03-22
编程技术问答社区