报错 undefined reference to `std::__throw_bad_array_new_length()‘

错误

先说这个错误,这个错误是链接器找不到这个c++特性,但是自己的cmake中是开启了高版本的c++的。不应该会出现错误,先是怀疑到了protobuf, (因为只要编译它生成的代码就报错),于是拉着grpc一起干掉了(怀疑是当时中间出了问题),删了重新编译。但依然还是有这个错误,于是困惑了几天,一直游走于各种论坛查找问题。

问题的解决:

由于工作的需要,机器是centos7的,gcc版本比较低,支持不了太高的c++特性,
但是为了不破坏机器本身的稳定性,不能贸然升级机器上的gcc和g++。

于是在非标准路径下从源码编译了一个高版本的gcc和g++,但是由于前置考察不足,
先下载了 devtoolset-10 ,后发现还不能满足自己的需要, 于是又下载了devtoolset-11

问题就出现在这里了,我既不能贸然替换标准路径的版本,因为编译自己工作的代码,高版本是编译不过的。所以为了快速切换,添加了环境变量,可以很快的切换。

但是环境变量写出问题了(就是忘改了)

export CC=/opt/rh/devtoolset-10/root/usr/bin/gcc
export CXX=/opt/rh/devtoolset-10/root/usr/bin/c++
export PATH=/opt/rh/devtoolset-11/root/usr/bin:$PATH
export LD_LIBRARY_PATH=/opt/rh/devtoolset-11/root/usr/lib64:$LD_LIBRARY_PATH

可以看到,我的gcc和g++版本用的是devtoolset-10, 但是 链接器的查找路径是devtoolset-11,这就导致了我的链接器找到的libc++的版本和我编译时的版本是不匹配的。

那问题来了,为什么以前编译的代码不会报错,使用protobuf编译的代码就出问题了?

因为protobuf生成的代码中使用了一些特定的C++标准库特性或模板,这些特性在编译时需要与标准库的实现严格匹配。如果链接器找到的是不同版本的标准库,那么这些特性就无法正确链接,从而导致了错误。

锅在我,无话可说。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值