使用Cygwin中的clang编译器时出现神秘的链接错误"undefined reference to `__gxx_personality_v0'"。

8

我做了一些搜索,所有的答案似乎都建议使用clang++代替clang(或者说用g++代替gcc),这也是我一开始所做的。然而,问题仍然存在,无论使用哪一个。

clang++ -Wall -std=c++11 -o test.exe test.cpp A.cpp B.cpp etc.cpp

或者

clang++ -lstdc++ -Wall -std=c++11 -o test.exe test.cpp A.cpp B.cpp etc.cpp

在Cygwin中,使用g++进行编译和链接都很好。
g++ -Wall -std=c++11 -o test.exe test.cpp A.cpp B.cpp etc.cpp

更新:

在链接期间,这里提供的信息显示clang是否尝试使用gcc进行链接,而不是g ++?如果是这种情况,为什么像下面建议的-lstdc++和-lsupc ++标志没有起作用呢?

COMPILER_PATH=/usr/lib/gcc/x86_64-pc-cygwin/4.8.3/:/usr/lib/gcc/x86_64-pc-cygwin/4.8.3/:/usr/lib/gcc/x86_64-pc-cygwin/:/usr/lib/gcc/x86_64-pc-cygwin/4.8.3/:/usr/lib/gcc/x86_64-pc-cygwin/:/usr/lib/gcc/x86_64-pc-cygwin/4.8.3/../../../../x86_64-pc-cygwin/bin/
LIBRARY_PATH=/usr/lib/gcc/x86_64-pc-cygwin/4.8.3/:/usr/lib/gcc/x86_64-pc-cygwin/4.8.3/../../../../x86_64-pc-cygwin/lib/../lib/:/usr/lib/gcc/x86_64-pc-cygwin/4.8.3/../../../../lib/:/lib/../lib/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-pc-cygwin/4.8.3/../../../../x86_64-pc-cygwin/lib/:/usr/lib/gcc/x86_64-pc-cygwin/4.8.3/../../../:/lib/:/usr/lib/
COLLECT_GCC_OPTIONS='-v' '-std=c++11' '-m64' '-o' 'testReSampling.exe' '-shared-libgcc' '-mtune=generic' '-march=x86-64'
 /usr/lib/gcc/x86_64-pc-cygwin/4.8.3/collect2.exe --build-id -m i386pep --wrap _Znwm --wrap _Znam --wrap _ZdlPv --wrap _ZdaPv --wrap _ZnwmRKSt9nothrow_t --wrap _ZnamRKSt9nothrow_t --wrap _ZdlPvRKSt9nothrow_t --wrap _ZdaPvRKSt9nothrow_t -Bdynamic --dll-search-prefix=cyg --tsaware -o testReSampling.exe /usr/lib/gcc/x86_64-pc-cygwin/4.8.3/../../../../lib/crt0.o /usr/lib/gcc/x86_64-pc-cygwin/4.8.3/crtbegin.o -L/usr/lib/gcc/x86_64-pc-cygwin/4.8.3 -L/usr/lib/gcc/x86_64-pc-cygwin/4.8.3/../../../../x86_64-pc-cygwin/lib/../lib -L/usr/lib/gcc/x86_64-pc-cygwin/4.8.3/../../../../lib -L/lib/../lib -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-pc-cygwin/4.8.3/../../../../x86_64-pc-cygwin/lib -L/usr/lib/gcc/x86_64-pc-cygwin/4.8.3/../../.. -lsupc++ /tmp/misc-8020e8.o /tmp/DataStruct-b10944.o /tmp/HyperGeometricPVal-edef1c.o /tmp/Array2EG-3441bb.o /tmp/GOCats-ff22c1.o /tmp/UGraph-10cfd8.o /tmp/testReSampling-9fb18c.o -lstdc++ -lgcc_s -lgcc -lcygwin -ladvapi32 -lshell32 -luser32 -lkernel32 -lgcc_s -lgcc /usr/lib/gcc/x86_64-pc-cygwin/4.8.3/../../../../lib/default-manifest.o /usr/lib/gcc/x86_64-pc-cygwin/4.8.3/crtend.o
/tmp/misc-8020e8.o:fake:(.eh_frame+0x47): undefined reference to `__gxx_personality_v0'
/tmp/misc-8020e8.o:fake:(.eh_frame$_ZNSt6vectorISsSaISsEE5clearEv+0x13): undefined reference to `__gxx_personality_v0'
/tmp/misc-8020e8.o:fake:(.eh_frame$_ZNSt6vectorISt4pairIjS0_ItdEESaIS2_EE5beginEv+0x13): undefined reference to `__gxx_personality_v0'
/tmp/misc-8020e8.o:fake:(.eh_frame$_ZNSt6vectorISt4pairIjS0_ItdEESaIS2_EE3endEv+0x13): undefined reference to `__gxx_personality_v0'
/tmp/misc-8020e8.o:fake:(.eh_frame$_ZNSt6vectorISt4pairIjS0_ItSt5arrayIdLm2EEEESaIS4_EE5beginEv+0x13): undefined reference to `__gxx_personality_v0'
/tmp/misc-8020e8.o:fake:(.eh_frame$_ZNSt6vectorISt4pairIjS0_ItSt5arrayIdLm2EEEESaIS4_EE3endEv+0x13): more undefined references to `__gxx_personality_v0' follow
collect2: error: ld returned 1 exit status
clang: error: linker (via gcc) command failed with exit code 1 (use -v to see invocation)
3个回答

6

1
遇到了同样的问题,不幸的是,我的代码中使用了 throw,所以 -fno-exceptions 不起作用 :( - Deqing
是的,那就是我一直在使用的。但如果需要涉及异常处理,那么... - CloudyTrees

2

好的,当我进一步在网上浏览时,我发现了一个相关的帖子,请查看nos的答案。

所以我意识到我是在Cygwin64终端上编译的,而Cygwin的clang端口是32位的。切换到Cygwin32终端后,一切都正常了。


现在Cygwin支持64位的clang吗? - CMCDragonkai
@CMCDragonkai,我一直在Cygwin中专门使用clang64来捕获错误(我大量使用模板,因此彩色的错误消息非常有用),但不幸的是,从未用于生成二进制文件。原因是gxx_personality_v0与clang处理异常的方式有关,而clang的方式似乎与Windows处理异常的方式不兼容。 - CloudyTrees
我刚在64位cygwin上尝试了clang/llvm的东西,但因为它使用gcc进行链接而不断遇到gxx_personalitylinker错误。 - CMCDragonkai
@CMCDragonkai,是的,那些就是我得到的错误。通常情况下,如果没有涉及到异常,并且在编译时你明确禁用了clang标志中的异常处理,那么事情会顺利进行(但这对我来说不是一个选项,因为我需要使用异常)。 - CloudyTrees
@CMCDragonkai,还有一点,有人已经成功地在Windows下使用MSVC和/或MingW从源代码构建了clang和llvm,但我没有成功,因为在MingW中gcc内置的一些奇怪的数学函数(这太糟糕了,因为我需要进行数字计算)。https://dev59.com/h2ox5IYBdhLWcg3wHAsA - CloudyTrees

0
尝试使用以下命令: clang++ -fno-exceptions -Xclang -fcxx-exceptions 或者 clang++ -Xclang -fseh-exceptions

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