c++ - 未定义对 `__gxx_personality_sj0` 的引用

标签 c++ gcc linker-errors undefined-reference

尝试执行此代码时使用 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
的 undefined reference 2.对_Unwind_SjLj_Register
的 undefined reference 3. undefined reference _Unwind_SjLj_Unregister
4.对_Unwind_SjLj_Resume的 undefined reference

到底是怎么回事?!

最佳答案

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

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

简短的回答是,这类问题是由不同编译器之间的 ABI 不兼容引起的,当您混合使用不同编译器编译的库或使用同一编译器的不兼容版本时,就会发生这种问题。

关于c++ - 未定义对 `__gxx_personality_sj0` 的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7751640/

相关文章:

c++ - 什么是 undefined reference /未解析的外部符号错误,我该如何解决?

c++ - AltiVec vec_msum 等效于浮点值

c++ - Cmake,在/usr/local/include 中找到头文件,在/usr/local/lib 中找到库

c++ - 带有派生类重载方法的 CRTP

c - 使用 MinGW 的 GCC 内联汇编加载 IDT 结构失败

c - 是否可以在 gcc 的 Makefile 中指示一个包含音频文件目录的标志?

编译具有有限库访问权限的程序

c++ - 如何正确链接 DevIL 链接器库?

c++ - 为什么 `S x({})` 仅在 GCC 7/C++1z 模式下调用默认构造函数?

c++ - cpp 链接器失败,无法追踪错误源