如何找到对c++符号的引用?
How can I find out the references to a C++ symbol
我正在开发一个现有的大型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
发出包含交叉引用表的链接器映射。更多信息在这里:
地图文件很长很简洁,但它通常有足够的信息来帮助你准确地找出为什么一个给定的符号仍然被引用。
相关文章:
- 未定义的引用,尽管存在符号,但 std::experimental::可选
- 为什么在引用指针时将 const 放在 & 符号的左侧有效,而在右侧则无效?
- 对符号'_ZN3ros10NodeHandle9subscribeERNS_16SubscribeOptionsE'的未定义引用
- 函数 _main (OPENGL C++) 中引用的未解析的外部符号 ________
- 对符号'_ZN3pcl7console5printENS0_15VERBOSITY_LEVELEPKcz'的未定义引用
- 函数 LNK2019 "int __cdecl __scrt_common_main_seh(void)" 中引用的未解析外部符号主错误 (?__scrt_common_main_seh@@YAHXZ
- 如何引用符号表中的值?
- 函数_wmain中引用未解析的外部符号_RasSetEntryPropertiesW@24
- 输入迭代器是否可以仅在赋值的右侧符号上取消引用?
- 未定义的引用,即使库正在链接并且它包含正确的符号
- C++ 链接器错误 LNK 2019 函数中引用的未解析的外部符号
- 建筑x86_64的未定义符号:"vtkDebugLeaksManager::vtkDebugLeaksManager()",引用自:
- boost::存在符号链接不取消引用
- 如何修复"未解析的外部符号"公共:void__thiscall canoid::getinput(void)"(?Getinput@Canoid@@QAEXXZ) 在函数 _main C++ 中引用
- 方法声明 c++ 后的引用符号
- 数据类型之后或变量名称之前的引用符号之间的差异
- 这个引用符号表示什么
- 错误:未定义文件中的第一个引用符号
- GCC报告基于版本库的未引用符号
- 错误:对cv:: videoccapture::~ videoccapture()的引用符号未定义,命令行中缺少DSO