c – 查找导致未定义引用错误的源代码行

c – 查找导致未定义引用错误的源代码行,第1张

概述迟早在C/C++编程时,每个人都将面临“未定义的参考错误”. 通常这是由缺少的库引起的,并且大多数错误在几秒钟内通过链接缺少的库来修复. 但是,例如,当使用具有单独文件的模板进行声明和实现时,可能会因“非预期”模板实例化而导致未定义的引用.不幸的是,我们现在获得的所有信息都是“未定义的引用错误”的实例,没有可能的原因提示,例如调用者的行号等. 我很好奇: 有没有一种简单的方法来发现调用函数/模板的 迟早在C/C++编程时,每个人都将面临“未定义的参考错误”.

通常这是由缺少的库引起的,并且大多数错误在几秒钟内通过链接缺少的库来修复.
但是,例如,当使用具有单独文件的模板进行声明和实现时,可能会因“非预期”模板实例化而导致未定义的引用.不幸的是,我们现在获得的所有信息都是“未定义的引用错误”的实例,没有可能的原因提示,例如调用者的行号等.

我很好奇:
有没有一种简单的方法来发现调用函数/模板的实际源代码行导致未定义的引用错误?

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

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

>编译器发出错误的调试信息(solaris studio 12.3在某些情况下进行调试/优化)
>对于超出范围的对象执行的析构函数
>编译器插入的代码:

>堆栈保护器
>消毒剂
>其他用于调试或分析代码的工具

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

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.oasdf.o:     file format elf64-x86-64Decoded dump of deBUG contents of section .deBUG_line:CU: asdf.cc:file name                           line number     Starting addressasdf.cc                                       1               0x1234asdf.cc                                       3               0x1254asdf.cc                                       5               0x1274

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

如果这不足以让你继续下去:当我想再继续下去时,我做了以下事情:

>插入一个链接标志以阻止它进行解码以获取受损的符号
>重新编译目标文件,但让它生成程序集
>在程序集中搜索损坏的符号

假设程序集注释得很好,那么从objdump程序集关联丢失的符号信息并不是非常困难,并且至少可以修复代码行以启动其余的搜索(假设你还有更多的兔子洞)像STL一样经常下去.

总结

以上是内存溢出为你收集整理的c – 查找导致未定义引用错误的源代码行全部内容,希望文章能够帮你解决c – 查找导致未定义引用错误的源代码行所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1244354.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存