c++ - 如何解释 'duplicated symbols' 错误中的符号?

标签 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 类,但是如何解释错误消息中的确切符号?我认为它们代表了一些函数或变量?

最佳答案

那些是“装饰”或“损坏”的名字。不同的 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&)

关于c++ - 如何解释 'duplicated symbols' 错误中的符号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43921041/

相关文章:

c++ - SDL_PollEvent() 空闲时口吃?

c++ - 传递 const-reference 参数有什么意义?影响大吗?

C++11 使用指针修改 initializer_list 中的元素导致 SIGSEGV,为什么?

linker - 通过 cocoapods 安装适用于 iOS 的 Google Maps SDK 会导致链接器错误

assembly - .bss 中的 ELF 重定位(但相对于 .bss)是什么意思?

android - undefined reference 将 Android 中的预构建共享库与 NDK 链接起来

c++ - unsigned char 变量不递增

c++ - 如何执行注入(inject)到进程中的应用程序

c++ - 使用 ncurses 时未定义对 `stdscr' 的引用

c - 即使使用 `noexecstack`,堆栈也是可执行的