当前位置 : 主页 > 编程语言 > c++ >

c – 对__gxx_personality_sj0`的未定义引用

来源:互联网 收集:自由互联 发布时间:2021-06-23
使用 gcc 4.6尝试执行此代码时: #include iostreamusing namespace std;#include bitsetint main(){ //Int a; long long min = std::numeric_limitsint::min(); unsigned long long max = std::numeric_limitsint::max(); cout "min: " min '\n';
使用 gcc 4.6尝试执行此代码时:

#include <iostream>

using namespace std;

#include <bitset>

int main()
{
   //Int<> a;
   long long min = std::numeric_limits<int>::min();
   unsigned long long max = std::numeric_limits<int>::max();
   cout << "min: " << min << '\n';
   cout << "max: " << max << '\n';
   cout << (min <= max);
   std::bitset<64> minimal(min);
   cout << "minimal: " << minimal;

   return 0;
}

我收到以下错误:
1.未定义的__gxx_personality_sj引用
2.未定义的_Unwind_SjLj_Register引用
3.未定义的_Unwind_SjLj_Unregister引用
4.未定义的_Unwind_SjLj_Resume引用

到底是怎么回事?!

这些函数是GCC的C异常处理支持的一部分. GCC支持两种异常处理,一种是基于对setjmp和longjmp(sjlj异常处理)的调用,另一种是基于DWARF调试信息格式(DW2异常处理).

如果您尝试在单个可执行文件中混合使用不同异常处理实现编译的对象,则会发生这些类型的链接器错误.您似乎正在使用DW2 GCC,但您尝试使用的某些库是使用sjlj版本的GCC编译的,从而导致这些错误.

简短的回答是这些问题是由不同编译器之间的ABI不兼容引起的,因此当您混合使用不同编译器编译的库或使用相同编译器的不兼容版本时会发生这种情况.

网友评论