gpt4 book ai didi

c++ - 使用 libclang 解析源文件 - 链接包含文件的问题

转载 作者:太空宇宙 更新时间:2023-11-04 12:48:57 35 4
gpt4 key购买 nike

我已经编写了一个脚本来使用 libclang 解析 C/C++ 文件图书馆。

我试图解析的文件:osf_sys.c .该程序打印文件中的每个函数/变量等。示例输出:

...
CURSORKIND: 6; __user at line: 469
CURSORKIND: 43; struct proplistname_args at line: 469
CURSORKIND: 6; nbytes at line: 470
...

所以我运行脚本 ./script osf_sys.c并且解析大部分有效。但是,我注意到 osf_sys.c 的某些部分没有被打印(缺少变量和诸如此类的东西),我怀疑它与头文件(位于单独的目录中)有关。我添加了一个代码片段来帮助调试/打印如下所示的错误消息。

尝试 1

在使用 CMake 构建脚本之后,我继续运行它。这是打印的错误:

/Linux_Kernel/linux/arch/alpha/kernel/osf_sys.c:13:10:
fatal error: 'linux/errno.h' file not found

它似乎在定位这个 osf_sys.c 的头文件时遇到了一些问题。 .所以我把这个添加到 CMakeLists.txt (这可能是错误的,因为问题似乎不在于我的程序的编译,而在于 libclang 如何定位东西):

-I/Linux_Kernel/linux/include

注意 errno.h 的完整路径是/Linux_Kernel/linux/include/linux/errno.h

尝试 2

我决定拖整个include/文件夹到与 osf_sys.c 相同的目录中居住在。

现在,运行它给我一个新的错误打印输出:

/Linux_Kernel/linux/arch/alpha/kernel/osf_sys.c:13:10: error:
'linux/errno.h' file not found with <angled> include; use "quotes" instead

其次是:

/Linux_Kernel/linux/arch/alpha/kernel/linux/errno.h:4:10:
fatal error: 'asm/errno.h' file not found

好了,现在好像在读什么东西。果然,有问题的行是#include <linux/errno.h>来自 osf_sys.c文件。第二个错误消息的出现大概是因为我没有拖动 asm/文件夹到与 osf_sys.c 相同的工作目录中.

尝试 3

所以,按照要求,我手动编辑了osf_sys.c改变#include <linux/errno.h>#include "linux.errno.h"

这一次,我留下了以下错误消息:

/Linux_Kernel/linux/arch/alpha/kernel/linux/errno.h:4:10: 
fatal error: 'asm/errno.h' file not found

尝试 4

传递 -I/Linux_Kernel/linux/include作为脚本的参数。该脚本将以下参数用于 CXTranslationUnit :

CXTranslationUnit translationUnit = clang_parseTranslationUnit(index, nullptr, argv, argc, 0, 0, CXTranslationUnit_KeepGoing);

这会产生其他类型的错误消息:

warning: 'linker' input unused [-Wunused-command-line-argument]
/Linux_Kernel/linux/arch/alpha/kernel/linux/errno.h:4:10: error: 'asm/errno.h' file not found
/Linux_Kernel/linux/include/linux/types.h:4:10: error: 'asm/types.h' file not found
...

还有什么事要做?

我无意编辑所有 #include语句(在每个 linux 内核文件中)使用双引号并拖动 include/使用 .c 将文件夹放入每个目录中文件。

希望得到一些关于如何制作 libclang 的建议搜索 include/我指定的文件目录。

关于我如何解决这个问题有什么建议/替代方案吗?

最佳答案

要正确解析源文件,您必须将用于编译内核的所有编译标志传递给 clang_parseTranslationUnit(通过 argv)。获得所有这些的最简单方法是构造 compilation database .您可以尝试使用 bear或寻找其他工具。另外,看看类似的问题:AST of a project by Clang

关于c++ - 使用 libclang 解析源文件 - 链接包含文件的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49987810/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com