【问题标题】:Undefined Symbol ___gxx_personality_v0 on link链接上未定义的符号 ___gxx_personality_v0
【发布时间】:2010-09-17 05:48:23
【问题描述】:

我一直在用这个命令行构建这个未定义的符号:

$ gcc test.cpp
Undefined symbols:
  "___gxx_personality_v0", referenced from:
  etc...

test.cpp 很简单,应该可以正常构建。什么交易?

【问题讨论】:

    标签: c++ c gcc g++


    【解决方案1】:

    使用

    g++ test.cpp
    

    相反,因为这是 C++ 代码。


    或者,如果您真的想使用gcc,请将-lstdc++ 添加到命令行,如下所示:

    gcc test.cpp -lstdc++
    

    针对每个场景下生成的a.out 运行md5 表明它是相同的输出。

    但是,是的,g++ 可能会让你的世界变得更简单。

    【讨论】:

    • 我认为 gcc 是识别 cpp 文件并将其传递给正确编译器的前端。
    • @Pax Diablo:是的,它使用正确的编译器,但是,g++ 将 libstdc++ 传递给链接器,而 gcc 没有。 :-P
    • 对,这是链接器问题,而不是编译问题。我通常不会像这样从命令行构建单个文件,所以我什至没有想到,只是输入 gcc 认为它会起作用。
    • 我自己也犯过同样的错误,至少我记得两次。 :-)
    • 这不一定是疲倦或愚蠢。我看到很多人回答使用 g++ 而不是 gcc,但这是一个糟糕的答案。询问和搜索的人可能没有这个选择。我正在使用具有 C 和 C++ 版本的库,并且正在编写一个 C 程序。链接到其中一些库使我不得不链接到 stdc++,我什至不得不用 -L 指定在 /usr/lib/gcc 中的何处找到它。
    【解决方案2】:

    .cpp 扩展使gcc 将您的文件编译为 C++ 文件。 (见GCC docs。)

    尝试编译相同的文件,但将其重命名为具有.c 扩展名:

    mv test.cpp
    gcc test.c
    

    或者,您可以通过将-x c 传递给编译器来显式指定语言:

    gcc -x c -c test.cpp -o test.o
    

    如果您在这些 C 语言版本上运行 nm test.o,您会注意到 ___gxx_personality_v0 未作为符号列出。
    (如果您对使用gcc -c test.cpp -o test.o 生成的目标文件运行相同的命令,则会出现___gxx_personality_v0 符号。)

    【讨论】:

      【解决方案3】:

      以防万一有人和我有同样的问题:文件扩展名应该是 .c 而不是 .C(gcc 区分大小写)。

      【讨论】:

      • 这是因为 .C 文件被 cpp 识别。例如,在 CMake 中也是如此。
      【解决方案4】:

      遇到同样的问题,但解决方案不同:

      静态库中的 C++ 代码被链接,并被 .m 文件引用。将 .m 文件重命名为 .mm 可解决此问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-10-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多