使用libclang解析源文件 - 链接包含文件

时间:2018-04-23 18:35:48

标签: c++ cmake clang clang++ 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(这可能是错的,因为问题似乎不是我的程序的编译,而是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/文件目录。

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

1 个答案:

答案 0 :(得分:0)

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