sma*_*llB 21 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;
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
1.未定义引用__gxx_personality_sj
2.未定义引用_Unwind_SjLj_Register
3. undefined引用_Unwind_SjLj_Unregister
4. undefined引用_Unwind_SjLj_Resume
到底是怎么回事?!
Man*_*rse 28
这些函数是GCC的C++异常处理支持的一部分.GCC支持两种异常处理,一种是基于对setjmp和longjmp(sjlj异常处理)的调用,另一种是基于DWARF调试信息格式(DW2异常处理).
如果您尝试在单个可执行文件中混合使用不同异常处理实现编译的对象,则会发生这些类型的链接器错误.您似乎正在使用DW2 GCC,但您尝试使用的某些库是使用sjlj版本的GCC编译的,从而导致这些错误.
简短的回答是,这些问题是由不同编译器之间的ABI不兼容引起的,因此当您混合使用不同编译器编译的库或使用相同编译器的不兼容版本时会出现这种情况.
正如smallB 在评论中指出的那样,你可能已经使用过gcc
,专注于C
程序,但你有一个C++
程序.
要编译C++
程序,请确保使用g++
编译器驱动程序!
例:
坏: gcc -o foo.exe foo.cpp
好: g++
-o foo.exe foo.cpp
以防万一其他人有这个问题:我在.o
为项目创建文件后更改了编译器.
当我重建同一个项目时,新编译器没有构建新.o
文件,因此他们缺少一些关键信息.删除旧文件并重建后,错误已得到修复.
我假设从头开始重建,没有删除,将工作相同.