如何在gcc中列出外部标识符?

如何在gcc中列出外部标识符?,c,gcc,identifier,C,Gcc,Identifier,我在一个C项目中有一个模块,其中包含大量的源文件和头文件。它们包括许多来自libc和同一项目的其他模块的外部头文件。我想从这些外部头文件中收集实际使用的标识符列表。不仅仅是符号,还有所有外部类型定义、内联函数、宏等 我想编译一个列表,看看这个模块有哪些外部依赖项,这样我就可以知道如果我想把这个模块转移到一个完全不同的项目中,到底需要移植/重写/抛出什么。在这个特殊的例子中,我对libc依赖关系不感兴趣,而是对来自同一项目的其他模块的依赖关系感兴趣 最近的一件事是临时删除include指令,如下所

我在一个C项目中有一个模块,其中包含大量的源文件和头文件。它们包括许多来自libc和同一项目的其他模块的外部头文件。我想从这些外部头文件中收集实际使用的标识符列表。不仅仅是符号,还有所有外部类型定义、内联函数、宏等

我想编译一个列表,看看这个模块有哪些外部依赖项,这样我就可以知道如果我想把这个模块转移到一个完全不同的项目中,到底需要移植/重写/抛出什么。在这个特殊的例子中,我对libc依赖关系不感兴趣,而是对来自同一项目的其他模块的依赖关系感兴趣

最近的一件事是临时删除include指令,如下所示:

sed -i s/"#include <.*>"//g *.c
sed -i s/"#include <.*>"//g *.h

然后用-Wno unused编译文件,这样我就可以看到由于缺少头而产生的错误消息。但它还远远不是一个易读的外部标识符列表。

它实际上比你所相信的更难,因为像这样的技巧可以构建符号,也因为一些特定于编译器的头——特别是——可能依赖于GCC内置或扩展,也可能是GCC接受的,等等

还请注意,编译器可能会将一个简单的printf转换为一个puts,在这种情况下,什么名称算

如果你真的想要什么,你可以定制,例如使用,以符合你的目的。这可能需要几个星期的工作

另一种方法可能是大致解析预处理的表单,收集其中的词汇标记,并对它们进行排序。您可以使用Flex生成Listar,并在C++或Python或OcAML或任何东西中编写实用程序;但它只会产生所用名称的近似值。。。如果想解析C++代码,则名称空间、模板、……/P>要困难得多。 如果您将自己限制为链接器可见符号,那么当然可以在对象文件和非剥离可执行文件上使用

顺便说一句,GCC可以处理-M来自动生成make依赖项

最后,即使使用最新的编辑,我也无法理解您的动机:如果您在某些GUI应用程序中包含了,则很可能没有使用GTK中定义的每个符号或标识符。。。同样,您可能不会使用或中的每个标识符。。。。实际上,您很可能不会使用大多数外部库提供的所有符号—您正在使用GTK、sqlite、libcurl等等


也许像这样的工具可能会有用。

为什么您那么关心使用的标识符?你的问题的确切动机是什么?请编辑您的问题以改进它!即使编辑了,我还是不明白你的动机。只要使用任何外部库,就很可能不会使用其中的所有名称…确切地说,我远没有使用外部库中的所有标识符,我只是想知道这些外部源中到底使用了什么。因为它仍然是一段相当大的代码,有很多对外部代码的引用,我不想逐行检查它并收集使用的类型/函数/宏的列表,我想要一些更自动化的东西。这将有助于我计划和准备交换到另一个外部库,据我所知,它现在拥有这段代码现在所使用的功能。是的,串联确实会让这变得更加困难。幸运的是,在这段代码中没有asm标签,我对gcc内置扩展不感兴趣。对于printf->put等优化,我关心原始标识符。但是,正如我在最初的问题中所更新的,在这个特定的情况下,libc依赖性对我来说并不是那么有趣。我也尝试过nm,但实际上大部分函数都是内联的。而且它不显示宏和类型定义,-M gcc选项也几乎就是我想要的:它可以给我一个头文件列表,但不能给我从头文件中使用的内容。要重新调整GTK的用途,示例:是的,我的模块很可能远没有使用GTK中的每个标识符,这就是为什么我想要一个从GTK中使用的内容的精确列表。因此,我可以看到,如果我想用其他东西替换GTK,我需要关心什么。但为什么你想要这个呢。一旦您使用GTK,您将包含并链接$pkg config-libs GTK+-x11-3.0,因此我不明白您的观点。如果用其他不可兼容的东西替换GTK,如果缺少某些东西,编译或构建将失败