vector只包含在一个源文件中。头文件中唯一的stl包含字符串。然而,我无法摆脱多重定义错误(例如下面的例子)。有什么想法吗?
./ plugin_dfb.o:mipsel-linux-uclibc/include/c ++ / 4.2.0 / bits / stl_bvector.h:182:`std :: operator-的多重定义(std :: _ Bit_iterator_base const&,std: :_Bit_iterator_base const&)' ./painter.o:mipsel-linux-uclibc/include/c++/4.2.0/bits/stl_bvector.h:182:首先在这里定义
答案 0 :(得分:1)
这个std :: operator-是一个带有外部链接的内联函数。看来链接器不支持此类内联函数的多个定义。但是C ++(ODR)的“一个定义规则”显然允许这样做。通常这样的符号会得到“弱链接”(GNU术语),但我认为目标文件格式和链接器都需要支持它。
我会尝试在专用于您的平台的群组/邮件列表中提出问题。 “平台X是否支持C ++关于链接以及C ++相关的内联函数和模板的一个定义规则?”。
您可能还想查看GCC文档。它们可能提供命令行开关作为解决方法。如果您还没有使用g ++作为链接器的前端,那么您应该尝试一下。也许这也有帮助。
答案 1 :(得分:0)
您是否尝试过使用#pragma once
?
答案 2 :(得分:0)
我认为您已将向量仅包含在一个头文件中,但该头文件没有#define块,这导致重新定义其中包含的向量头文件。 请将您的包含文件包含在下面给出的模板中并尝试。
#if !defined(HEADER_FILE)
#define HEADER_FILE
// Your code
#endif
答案 3 :(得分:0)
由于在链接期间出现问题,它看起来与模板实例化有关。给定实例化实现细节,模板函数/定义应放在公共包含文件中,以确保它们在任何地方都可见,并且不重复标题包括这里的情况。
从您发布的问题涉及运算符 - 可以由find()类型函数调用的std :: distance()使用。因此,看看你是否定义或调用了这些函数,因为它们可以使用向量和字符串,并确保它们位于共享头文件中。