如何找到对c++符号的引用?

How can I find out the references to a C++ symbol

本文关键字:引用 符号 c++ 何找      更新时间:2023-10-16

我正在开发一个现有的大型c++代码库(超过100万行代码)。我需要删除一些被认为无用的代码部分。然而,当我只是从构建过程中排除那部分代码(即不编译它们)时,最终我在链接一些符号(类函数名)时得到了"未定义的引用"错误。

当我试图找出其他代码中有引用的地方时,出现了一个问题。使用Cscope或OpenGrok,我可以找到一些显式引用,但在删除这些引用后并没有真正帮助。还有许多其他情况间接指向我删除的符号,例如:

virtual functions overridden in child class
"typedef" defined other symbol to refer to this missing symbol.

我的问题是:是否有任何gcc/g++选项我可以打开有所有引用的输出(gcc/g++知道)直接或间接到我删除的符号?

如果没有这样的gcc/g++选项,是否有其他工具可以产生这样的输出?

谢谢。

从项目中删除编译单元(c或cpp文件)并不能完全删除它们。这些通常只是函数和类的定义。这些函数和类的声明仍然存在于头文件中,这些头文件可能仍然包含在其他编译单元中。

跟踪这些东西是在哪里声明的(通常在头文件中),或者在头文件中注释掉它们,或者如果你的项目不需要在头文件中包含任何东西,就完全停止包括头文件。

例如:

如果您要从项目中删除foo.c,请确保已从所有其他c/cpp文件中删除了#include "foo.h"的任何实例

您可以指示LD使用标志-Map=path/to/my_mapfile.map--cref发出包含交叉引用表的链接器映射。更多信息在这里:

https://sourceware.org/binutils/docs/ld/Options.html

地图文件很长很简洁,但它通常有足够的信息来帮助你准确地找出为什么一个给定的符号仍然被引用。