gpt4 book ai didi

c++ - 查找导致 undefined reference 错误的源代码行

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:40:11 24 4
gpt4 key购买 nike

用C/C++编程时,迟早每个人都会遇到“ undefined reference 错误”。

这通常是由于缺少库引起的,并且大多数错误都可以在几秒钟内通过链接到缺少的库来修复。但是,例如,当一个人使用带有单独文件的模板进行声明和实现时,可能会得到由“意外”模板实例化引起的 undefined reference 。不幸的是,我们现在得到的所有信息都是“ undefined reference 错误”的实例,没有可能的原因提示,例如调用者的行号等。

我好奇的是:有没有一种简单的方法可以找出调用导致 undefined reference 错误的函数/模板的实际源代码行?

最佳答案

正如我在对 this question 的回答中提到的那样,是否直接获取导致链接错误的行号取决于编译器是否发出了所有必要的信息。

首先,这些是我遇到的导致您所看到的行为的案例:

  • 编译器发出错误的调试信息(solaris studio 12.3 在某些情况下进行了调试/优化)
  • 为超出范围的对象执行的析构函数
  • 编译器插入的代码:
    • 堆栈保护器
    • sanitizer
    • 用于调试或分析代码的其他工具

如果您遇到类似以下的链接错误,我建议的跟踪它可能会有所帮助:

asdf.o: In function `whatever':
asdf.o(.text+0x1238): undefined reference to `fdsa'

...因为至少您有一个可以使用的地址。

首先,尝试addr2line:

~ addr2line -e asdf.o 0x1238
# If it works, you'll get:
asdf.cc:N
# If it doesn't work, you'll get:
??:?

如果失败,请尝试 objdump:

~ objdump --dwarf=decodedline asdf.o

asdf.o: file format elf64-x86-64

Decoded dump of debug contents of section .debug_line:

CU: asdf.cc:
File name Line number Starting address
asdf.cc 1 0x1234
asdf.cc 3 0x1254
asdf.cc 5 0x1274

在我给出的完全捏造的示例中,.debug_line 中没有对应于 0x1238 的条目(链接器错误中的地址),因此它可能是编译器的魔法(例如,由堆栈保护器或 sanitizer 之类的东西添加的额外代码),或者希望它与第 1/3 行发生的任何事情有关,因为地址在这两行之间。

如果这还不足以让您继续:当我想要继续进行下去时,我做了以下操作:

  1. 插入一个链接标志以阻止它通过分解来获取损坏的符号
  2. 重新编译目标文件,但让它生成程序集
  3. 在程序集中搜索损坏的符号

假设程序集注释得足够好,将丢失的符号 + 来自 objdump 的信息 + 程序集关联起来并至少修复代码行以启动剩下的搜索(假设您仍然有更多的兔子洞要钻进去,就像 STL 中经常出现的情况一样)。

关于c++ - 查找导致 undefined reference 错误的源代码行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16836577/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com