一次链接错误的排查

同事新给我一版QEMU包,编译时有如下的链接错误:
undefine reference to ‘std::__cxx11::basic_stringstream<char, std::char_traits, std::allocator >::basic_stringstream()’
undefine reference to ‘std::__cxx11::basic_ostringstream<char, std::char_traits, std::allocator >::basic_ostringstream()’

作为一名老码农,很快就明确这个报错是没有找到函数定义,看函数名,知道这些函数来自编译器自带的库,猜测可能是编译器自带的libstdc++.a没有参与链接. 用 -lstdc++将libstdc++.a加入链接后,情况无改善.

用出错信息作为关键字搜索,看到gcc 5.0之后为了支援c++ 11,标准库里的新增了namespace,同时有std::和std::__cxx11两个namespace, 代码std::string在g++ 5.0或者之后的版本,默认会变成std::__cxx11::basic_string,不是std::basic_string,用宏_GLIBCXX_USE_CXX11_ABI可以控制默认的处理方式。我用g++ -v确认版本是7.5.0, 是支持std::__cxx11::这个namespace的, 仍然报错就觉得奇怪. 和同事确认, 同事说已经用了g++ 6.2来编译.

实在没有办法,就用nm来dump libstdc++.a究竟提供了哪些函数. 执行的命令如下:
nm /usr/lib/gcc/libstdc++.a | c++filt

在输出里搜索,发现有如下的析构函数:
undefine reference to ‘std::__cxx11::basic_stringstream<char, std::char_traits, std::allocator >::~basic_stringstream()’
undefine reference to ‘std::__cxx11::basic_ostringstream<char, std::char_traits, std::allocator >::~basic_ostringstream()’
而没有链接报错里面的构造函数.

对这个结果我也是很意外. 说明g++ 的cxx11库实现有好几个版本, 而且g++ 7.5.0及8.4里面,只有析构函数,没有构造函数.确定了原因后,再次告诉同事,同事表示由于他操作出错,编译用的g++版本并不是6.2,用的是更新的版本,在提供新包后,问题得到解决.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值