尝试执行此代码时使用 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/