我编写了一个脚本来使用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
的某些部分没有打印(缺少变量和诸如此类),我怀疑它与头文件(位于单独的目录中)有关。我添加了一个代码片段来帮助调试/打印下面显示的错误消息。
使用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
我决定将整个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
相同的工作目录中。
因此,根据要求,我手动修改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
将-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/
文件目录。
关于我如何解决这个问题的任何建议/替代方案?
答案 0 :(得分:0)
要正确解析源文件,必须将clang_parseTranslationUnit
(通过argv)传递给用于编译内核的所有编译标志。获得所有这些的最简单方法是构建compilation database。您可以尝试使用bear或寻找其他工具。
另外,请查看类似的问题:AST of a project by Clang