重复符号链接器错误(C++ 帮助)
Posted
技术标签:
【中文标题】重复符号链接器错误(C++ 帮助)【英文标题】:Duplicate Symbol Linker Error (C++ help) 【发布时间】:2011-02-26 14:38:33 【问题描述】:我现在正在学习一些 CSP(约束满足)理论知识,并且正在使用 this 库来解析 XML 文件。我使用 Xcode 作为 IDE。
我的程序编译得很好,但是当它链接文件时,XMLParser_libxml2.hh 文件出现重复符号错误。我的文件是这样分开的:
包含上述 XMLParser 文件的类头文件 包含类头文件的类实现文件 包含类头文件的主文件
重复符号出现在 main.o 和 classfile.o 中,但据我所知,我实际上并没有将该 .hh 文件添加两次。
完全错误:
ld: duplicate symbol bool CSPXMLParser::UTF8String::to<std::basic_string<char,
std::char_traits<char>, std::allocator<char> > >(std::basic_string<char,
std::char_traits<char>, std::allocator<char> >&) constin
/Users/vash265/CSP/Untitled/build/Untitled.build/Debug/Untitled.build/Objects-
normal/x86_64/dStructFill.o and
/Users/vash265/CSP/Untitled/build/Untitled.build/Debug/Untitled.build/Objects-
normal/x86_64/main.o`
将类的实现复制到主文件中并从编译目标中取出类实现文件可以消除错误,但这样会变得杂乱无章,我很快就会添加更多类(它会很高兴将它们放在单独的文件中)。
据我了解,这是由文件 (XMLParser_libxml2.hh) 在一个文件中同时包含类和函数定义和实现引起的(似乎这可能是必要的,因为使用该“头”文件中的模板)。关于如何绕过将所有类文件粘贴在 main.cpp 中的任何想法? (我试过#ifdefs
,它们不起作用)。
【问题讨论】:
头文件中的所有函数(除了在类定义或函数模板中定义的成员函数)是否都声明了inline
?
我们需要更多关于您的代码结构的详细信息,并且需要知道生成重复符号错误的类是由您编写的还是已经存在。基本上,这意味着您尝试将代码链接两次。然而,这听起来确实像我曾经遇到的一个问题,这是由于我构建应用程序的方式,即我使用了静态和动态链接的混合。因此,请确保将所有静态或动态链接。两者兼而有之很复杂,我没有深入探讨
@James 如果您指的是链接中提供的头文件,那么我相信所有函数都是类的成员函数。由于代码有点混乱,所以很难说。就我自己的代码而言,我没有任何不是成员函数的函数。 @Yan 产生错误的文件最终是由我创建的。该错误源于在我的类头文件中包含 XMLParser 头(不是我编写的),而该头文件又包含在主函数和类实现文件中(我编写的,并且是错误中命名的文件)。跨度>
【参考方案1】:
詹姆斯是对的。需要将头文件中的三个模板函数声明为内联才能正确链接。谢谢!
【讨论】:
以上是关于重复符号链接器错误(C++ 帮助)的主要内容,如果未能解决你的问题,请参考以下文章
Firebase CocoaPods 出现重复符号链接器错误
Xcode 10b5 - 重复符号链接器错误,无法使用 Crashlytics 编译
链接器命令失败,退出代码为 1 - 重复符号 __TMRbBp