【发布时间】:2013-05-30 12:44:35
【问题描述】:
使用 C/C++ 编程时,每个人迟早都会面临“未定义的引用错误”。
这通常是由缺少库引起的,并且大多数错误通过链接缺少的库在几秒钟内得到修复。 但是,例如,当使用具有单独文件的模板进行声明和实现时,可能会由于“意外”模板实例化而导致未定义的引用。不幸的是,我们现在得到的所有信息都是“未定义的引用错误”的实例,没有可能的原因提示,例如调用者的行号等。
我好奇的是: 有没有一种简单的方法来发现调用函数/模板导致未定义引用错误的实际源代码行?
【问题讨论】:
-
它通常给出函数的名称,只要它被称为相当独特的名称,您就可以使用
grep -n来获取行号...但是如果您有 400 个称为 @987654322 的函数@ 这可能没有多大帮助... -
不就是对符号名称进行拆解的问题吗?但我想这取决于你所说的这个神秘的“C/C++”是什么意思。
-
只是
grep未定义标识符的文件。 -
只是说使用 grep 查找函数不是解决方案。范围解析运算符可能已被遗漏,导致成员函数未定义,生成文件/项目中可能未包含更正文件,可能未包含正确的编译器特定导出,可能已遗漏外部,或链接的项目可能在从 C++ 引用的 C 代码中,而来自 extern c 的 C 可能已被遗漏。 Grep 可能会找到其中的一些,但它绝不会找到全部。并不是所有带有 GCC 的系统都有 grep。这里真正的问题是解决棘手的问题。
-
这不仅仅是一个解构问题,例如,参见实例化的模板,这些符号在原始源代码中可能很难发现。人们可能会使用 grep 之类的工具或一般的“在文件中查找 [XYZ]”来发现错误。我只是好奇是否有办法让编译器/链接器工具链提示我正确的方向,而不是自己做。由于编译器和链接器工具和步骤的分离,这可能是不可能的,但从理论上讲,工具链应该可以提供更多信息。