矢量多个定义链接错误

时间:2009-12-29 11:04:32

标签: c++ vector multiple-definition-error

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:首先在这里定义

4 个答案:

答案 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()使用。因此,看看你是否定义或调用了这些函数,因为它们可以使用向量和字符串,并确保它们位于共享头文件中。