- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
这是来自操作系统开发网站的二手问题,但它让我很好奇,因为我在任何地方都找不到合适的解释。
使用 gcc 编译和链接独立 C++ 程序时,有时会出现如下链接器错误:
out/kernel.o:(.eh_frame+0x11): undefined reference to `__gxx_personality_v0'
这显然是因为该符号是在 libstdc++ 中定义的,而独立环境中缺少该符号。解决这个问题只需要在某个地方定义这个符号:
void *__gxx_personality_v0;
这很好,但我不喜欢神奇地起作用的东西......所以问题是,这个符号的目的是什么?
最佳答案
它用于堆栈展开表,例如,您可以在 my answer to another question 的汇编输出中看到它。 .如该答案所述,其用途由 Itanium C++ ABI 定义。 , 它被称为 Personality Routine .
通过将其定义为全局 NULL void 指针来“工作”的原因可能是因为没有抛出异常。当某些东西试图抛出异常时,你会发现它行为不端。
当然,如果没有使用异常,你可以使用 -fno-exceptions
禁用它们(如果没有使用 RTTI,你也可以添加 -fno-rtti
)。如果您正在使用它们,则必须(正如其他答案已经指出的那样)与 g++
而不是 gcc
链接,这将添加 -lstdc++
你。
关于c++ - __gxx_personality_v0 有什么用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/329059/
这个问题在这里已经有了答案: 关闭11年前. Possible Duplicate: Undefined Symbol ___gxx_personality_v0 on link 我对以下程序有疑问。
我做了一些搜索,所有答案似乎都建议使用 clang++ 而不是 clang(或者更确切地说是 g++ 代替 gcc),这就是我最初所做的。尽管如此,问题仍然存在,无论是 clang++ -Wall -
我是一名优秀的程序员,十分优秀!