连接错误 "undefined reference to `__gxx_personality_v0'" 和 g++ 相关。

93
我有一个关于以下程序的问题。

可能是重复问题:
链接时出现未定义符号___gxx_personality_v0

与此相关的是IT技术。

// fkt.cpp

#include "fkt.h"

int add2(int a, int b)
{
    return a+b;
}

并且头部:

// fkt.h

int add2(int a, int b);

现在我用以下方式进行编译:
g++ -c fkt.cpp

现在我运行nm命令,得到以下结果:
00000000 T _Z6add2ii
         U __gxx_personality_v0

当我想在任何地方使用该函数时,我会遇到以下问题:
(.eh_frame+0x12): undefined reference to `__gxx_personality_v0'

我该如何解决这个问题?(我正在使用Ubuntu Linux操作系统。)


1
你能让我们看看你用来连接的命令行吗?(如果你还没有使用 g++ 进行连接,那么你应该也要使用它。) - Rup
1
你尝试过使用 g++ ftk.cpp -o ftk 吗? - karlphillip
我使用 FFI 与 GHC 进行链接。 - develhevel
5
当我在Makefile中忘记将“gcc”更改为“g ++”时,出现了这个错误...LOL ;) - enthusiasticgeek
你说的“使用这个函数”是指在那种情况下切换到gcc吗? - rogerdpack
2个回答

140

如果 g++ 仍然报错,请尝试使用:

g++ file.c -lstdc++

看看这篇帖子:什么是 __gxx_personality_v0?

确保 -lstdc++ 出现在命令的末尾。如果将其放在开头(即在 file.c 之前),您仍然会遇到相同的错误。


我不知道-lstdc++是什么,但它帮助我为我的jni项目编译.so库。谢谢。 - Andrzej Rehmann
5
它链接了C++标准库。 - phoxis
3
他确定他在调用g++而不是gcc吗?-- 他不应该手动添加-lstdc++。 - Rich Henry

74

听起来你正在尝试使用gcc而不是g++链接你的结果对象文件:

请注意,使用C++对象文件的程序必须始终使用g++进行链接,以提供适当的C++库。 如果尝试使用C编译器gcc链接C++对象文件,则会导致C++标准库函数的“未定义引用”错误:

$ g++ -Wall -c hello.cc
$ gcc hello.o       (should use g++)
hello.o: In function `main':
hello.o(.text+0x1b): undefined reference to `std::cout'
.....
hello.o(.eh_frame+0x11):
  undefined reference to `__gxx_personality_v0'

来源: 《GCC 简介 - 适用于 GNU 编译器 gcc 和 g++》


1
在使用 distcc 时,我遇到了这个问题,因为它默认使用的是 gcc 而不是 g++。解决方法是指定编译器 distcc g++ [...] - jotrocken
在使用 Arduino Sketch 时,添加 -fno-threadsafe-statics 解决了我的问题。 - Soundararajan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接