报错 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
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: std::bad_array_new_length 是一个 C++ 标准库中的异常类,表示数组长度无效或超出了最大限制。它通常在使用 new 分配数组时发生,如果指定的长度为负数或超过了系统允许的最大值,就会抛出该异常。 ### 回答2: std::bad_array_new_length是C++标准库中的一个异常类,它表示一个数组的长度为负或太大。 在C++中,我们可以使用new运算符来动态地分配一段内存,并将其用作数组。但是,由于内存是有限的,分配的内存也是有限制的。如果我们尝试分配超出内存限制的内存,或者将数组的长度设为负数,则new运算符将会抛出std::bad_array_new_length异常。 这个异常类通常发生在下列情况下: 1. 当使用new运算符分配内存时,指定了一个太大的数组长度,超出了操作系统可分配内存的上限。 2. 当使用new运算符分配内存时,将数组的长度设置为负数或0。 为了避免这个异常的发生,我们需要时刻考虑内存的分配和使用,避免过度分配内存或使用大量的内存。 此外,在程序设计时,我们还应该注意错误处理和异常处理。当出现std::bad_array_new_length异常时,我们应该立即停止程序,并给出相应的错误提示。这样可以帮助我们尽快找到并解决程序中的问题。 总之,std::bad_array_new_length异常是C++中常见的一个异常,它提示我们需要更加仔细地管理内存,在使用new运算符分配内存时,始终注意内存限制和数组长度的范围,避免过度分配内存或使用大量的内存。同时,及时处理异常也是非常重要的,以便避免程序出现更多的问题。 ### 回答3: std::bad_array_new_length 是一个标准异常类,它是在 C++11 中引入的。当在动态数组中尝试使用非法长度时,就会抛出该异常。如果动态数组长度为“负数”或者因为溢出而导致它大于可用内存,就会触发该异常。 让我们假设您正在尝试创建一个动态数组,并分配给它一个长度。如果你传递给 new[] 一个非法的长度,例如一个负数或者一个大于可用内存的值,那么编译器将抛出 std::bad_array_new_length 异常。这严重影响程序的可靠性,因为它可以导致程序崩溃或者出现未知的行为。 对于这种类型的异常,我们可以使用 C++ 的异常处理机制来捕获并处理它。例如,我们可以在 try 块中尝试分配动态数组的长度,然后在 catch 块中处理 std::bad_array_new_length 异常。在 catch 块中,我们可以记录日志、重新抛出异常、从函数中返回错误代码或者执行其他必要的操作。 为了避免 std::bad_array_new_length 异常的发生,我们应该在动态数组分配前仔细检查数组长度的值,确保它们都是合法的,同时也要注意内存的使用情况。 总而言之,std::bad_array_new_length 异常是一种在 C++ 中广泛使用的异常类型。当我们使用动态数组时,尤其是在分配长度时,应该遵循一些最佳实践,以确保程序的可靠性和稳定性。我们应该小心处理这种异常,并尽可能地合理使用内存。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值