用libclang解析源文件 - 链接问题包括文件



我已经写了一个使用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中(这可能是错误的

-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

好吧,现在似乎正在阅读一些东西。果然,所讨论的行是osf_sys.c文件中的#include <linux/errno.h>。第二个错误消息大概是因为我没有将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内核文件中(使用double引号,并使用.c文件将include/文件夹拖动到每个单一目录中。

感谢有关如何制作libclang搜索include/文件目录的一些建议。

关于如何解决此问题的任何建议/替代方案?

要正确解析源文件,您必须将其传递给clang_parseTranslationUnit(通过ARGV((通过ARGV(所有用于编译内核的编译标志。获取所有这些方法的最简单方法是构建编译数据库。您可以尝试使用熊或寻找其他工具。另外,查看类似的问题:clang

的项目的AST

最新更新