重复符号链接器错误(C++帮助)

6
我正在学习一些CSP(约束满足)理论知识,并且正在使用这个库来解析XML文件:this。 我在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,但它们不起作用)。

5
除了在类定义或函数模板内定义的成员函数之外,头文件中的所有函数是否都声明为 inline - James McNellis
我们需要更多关于你的代码结构的细节,并且需要知道生成重复符号错误的类是由你编写还是已经存在。基本上,这意味着您正在尝试链接您的代码两次。然而,这听起来像我曾经遇到过的问题,这是由于我构建应用程序的方式,即我使用了静态和动态链接的混合。因此,请确保您链接所有静态或所有动态内容。同时使用两者是很复杂的,我没有涉及到这个问题。 - yan bellavance
@James如果你指的是提供链接中的头文件,那么我认为所有的函数都是一个类的成员函数。由于代码有点混乱,很难确定。就我的代码而言,我没有任何不是成员函数的函数。@Yan生成错误的文件最终是由我创建的。错误是由于在我的类头文件中包含了XMLParser头文件(不是我编写的),然后将其包含在主函数和类实现文件中(这些文件是我编写的,并且是错误命名的文件)。 - Vash265
1个回答

3

詹姆斯是正确的。头文件中的三个模板函数需要声明为内联才能正常链接。谢谢!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接