c ++ - 如何解释重复符号中的符号'错误?

时间:2017-05-11 16:29:22

标签: c++ linker

我正在开发一个c ++程序。

由于几个文件相互依赖,我一次性实现它们然后编译错误。

以下是错误消息:

duplicate symbol __ZN5RendrlsERNSt3__113basic_ostreamIcNS0_11char_traitsIcEEEERNS_8Vector3DE in:
    CMakeFiles/Rendr.dir/src/main.cpp.o
    CMakeFiles/Rendr.dir/src/ray_tracer.cpp.o
duplicate symbol __ZN5RendrlsERNSt3__113basic_ostreamIcNS0_11char_traitsIcEEEERKNS_8Vector2DE in:
    CMakeFiles/Rendr.dir/src/main.cpp.o
    CMakeFiles/Rendr.dir/src/ray_tracer.cpp.o
duplicate symbol __ZN5RendrlsERNSt3__113basic_ostreamIcNS0_11char_traitsIcEEEERNS_8Vector3DE in:
    CMakeFiles/Rendr.dir/src/main.cpp.o
    CMakeFiles/Rendr.dir/src/CGL/svgparser.cpp.o
duplicate symbol __ZN5RendrlsERNSt3__113basic_ostreamIcNS0_11char_traitsIcEEEERKNS_8Vector2DE in:
    CMakeFiles/Rendr.dir/src/main.cpp.o
    CMakeFiles/Rendr.dir/src/CGL/svgparser.cpp.o
...
duplicate symbol __ZN5RendrlsERNSt3__113basic_ostreamIcNS0_11char_traitsIcEEEERKNS_8Vector2DE in:
    CMakeFiles/Rendr.dir/src/main.cpp.o
    CMakeFiles/Rendr.dir/src/CGL/triangulation.cpp.o
ld: 15 duplicate symbols for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[3]: *** [Rendr] Error 1
make[2]: *** [CMakeFiles/Rendr.dir/all] Error 2
make[1]: *** [CMakeFiles/Rendr.dir/rule] Error 2
make: *** [Rendr] Error 2

我没有粘贴我的一大堆代码,因为我的问题是我无法理解__ZN5RendrlsERNSt3__113basic_ostreamIcNS0_11char_traitsIcEEEERKNS_8Vector2DE之类的内容,因此我不知道如何找到不正确的代码片段

我之前只遇到像_main这样的符号,而且很容易理解。

我已经定义了Vector3DVector2D类,但是如何解释错误消息中的确切符号?我认为它们代表了一些函数或变量?

1 个答案:

答案 0 :(得分:7)

这些是“装饰”或“受损”的名字。不同的C ++编译器对名称修饰有不同的规则。

您可以使用这个方便的在线工具对其进行解码:https://demangler.com/

例如:

__ZN5RendrlsERNSt3__113basic_ostreamIcNS0_11char_traitsIcEEEERKNS_8Vector2DE

取消了

_Rendr::operator<<(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, Rendr::Vector2D const&)

如果您有c++filt可用,则可以在命令行执行此操作:

$ c++filt -_ __ZN5RendrlsERNSt3__113basic_ostreamIcNS0_11char_traitsIcEEEERKNS_8Vector2DE`
Rendr::operator<<(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, Rendr::Vector2D const&)