【问题标题】:Mysterious linker error "undefined reference to `__gxx_personality_v0'" using clang in cygwin在 cygwin 中使用 clang 出现神秘的链接器错误“未定义对 `__gxx_personality_v0' 的引用”
【发布时间】:2014-11-23 00:32:55
【问题描述】:

我做了一些搜索,所有答案似乎都表明使用 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)

【问题讨论】:

    标签: c++ gcc cygwin clang


    【解决方案1】:

    找到了这个解决方案:

    https://cygwin.com/ml/cygwin/2015-06/msg00294.html

    编译时基本上只需在命令行中添加-fno-exceptions,例如clang++ helloworld.cpp -std=c++11 -fno-exceptions

    【讨论】:

    • 遇到了同样的问题,不幸的是,我在我的代码中使用了throw,所以-fno-exceptions 不起作用:(
    • 是的,这就是我一直在使用的。但是如果必须涉及异常,那么...
    【解决方案2】:

    好的,当我进一步在网上闲逛时,我找到了一个相关的post,请参阅 nos 的答案。

    所以我意识到我正在使用 Cygwin64 终端进行编译,而 Cygwin 的 clang 端口是 32 版本。切换到 Cygwin32 终端后,一切正常。

    【讨论】:

    • Cygwin 现在支持 64 位 clang 吗?
    • @CMCDragonkai,我一直在 Cygwin 中使用 clang64 专门用于捕获错误(我大量使用模板,因此彩色错误消息很有帮助),但不幸的是,从未用于生成二进制文件。原因是gxx_personality_v0这个东西和clang处理异常的方式有关,clang的方式好像和windows处理异常的方式不兼容。
    • 我刚刚在 64 位 cygwin 上尝试了 clang/llvm 的东西,并且由于某种原因它使用 gcc 进行链接,所以一直遇到 gxx_personalitylinker 之类的错误。
    • @CMCDragonkai,是的,这些是我得到的错误。通常,如果不涉及异常,并且在编译时显式禁用 clang 标志中的异常处理,则一切正常(这对我来说不是一个选项,因为我需要使用异常)。
    • @CMCDragonkai,另外一点,有人使用 MSVC 和/或 MingW 在 windows 下成功地从源代码构建了 clang 和 llvm,但我没有成功,因为来自 gcc 的一些奇怪的内置数学函数MingW(这也太糟糕了,因为我做数字运算)。 stackoverflow.com/questions/9427356/…
    【解决方案3】:

    试试:clang++ -fno-exceptions -Xclang -fcxx-exceptionsclang++ -Xclang -fseh-exceptions

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-28
      • 2017-05-02
      • 1970-01-01
      • 2012-05-12
      • 2022-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多