任意C项目的预处理

时间:2016-11-19 15:42:01

标签: python c gcc c-preprocessor pycparser

我想在python中编写一个好的callgraph程序,因此我使用了pycparser。 Pycparser需要预处理c文件才能正确创建抽象语法树。 我的第一种方法是在文件上只使用gcc的-E选项,然后将其传递给pycparser。 但是对于不同的项目,我得到“No such file or directory”错误,因为gcc找不到特定的标题。如果我尝试使用gcc -E `find | grep "\.c"\`预处理linux内核,它会错过一些头文件,例如那些带有Linux /前缀的头文件,因为没有这样的文件夹。在我看来,我需要一些额外的标志,以便gcc传递头文件的位置并正确预处理。是否有预处理任意C项目的一般方法?

另外我想如果我让它正确预处理,不同文件中有相同功能的多个副本。有没有办法确定函数的原始文件?

1 个答案:

答案 0 :(得分:1)

您需要了解GCC如何查找头文件,至少包括编译器命令行开关和搜索路径的环境变量。

我怀疑各种项目集配置变量的构建脚本会影响GCC如何找到任何特定编译的头文件。许多这样的脚本甚至在命令行上进行宏替换,这意味着你必须知道脚本正在做什么。

如果您将C源文件与设置其构建上下文的make脚本隔离,GCC将无法找到正确的标头。这就是你的问题。

您可能需要运行构建脚本,并拦截对GCC的调用以捕获必要的上下文。