5 解析未定义的符号(下)

本文详细介绍了在C++编程中遇到的符号解析问题,包括如何进行符号的反改编以查看改编后的名称,如何在C和C++代码连接时避免链接错误,以及如何诊断和解决编译器版本不匹配导致的链接问题。通过nm工具分析对象文件的符号表,找出编译器版本信息,以确定正确的编译和连接策略。
摘要由CSDN通过智能技术生成

——《软件调试实战》

C++的命名空间、类、模板或函数重载等特征使得编译和链接更为复杂,这使得符号的不匹配更有可能引发链接问题。甚至利用C和C++编译器编译相同的C源代码也会得到不同的符号。
nm

1 符号的反改编(demangle)
为观察经过名称改编的符号,可以对这些符号进行反改编。有两种反改编方法:一是使用实用程序(analysis utility),它们可以在改编和反改编之间切换;二是使用过滤器,如c++filt。通过选项-C或–demingle可以调用实际的用户级别的符号名称。
c++filt

2 连接C和C++代码
  仅使用C编译器驱动程序并不能保证源代码实际上被编译为C代码,编译器驱动程序可能根据文件扩展名来决定生成C或C++风格的符号。例如,如果用gcc编译 .c 文件,则此文件被编译为C代码,而扩展名为 .cc, .cpp, .cxx 的文件则被编译为C++代码。
  C++经常需要连接C对象文件中的符号,这往往导致链接上的问题。解决方法是明确地通知C++编译器不对哪些需要由C对象文件中的符号来解析的未定义符号进行名称改编。这可以通过在相应声明中使用extern "C" 编译器指令来实现。
  如下声明,可使函数factorail()被C++编译器编译后,仍可链接到C

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值