【问题标题】:vector multiple definition link errors向量多重定义链接错误
【发布时间】:2010-12-30 18:03:21
【问题描述】:

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

【问题讨论】:

  • 所有头文件都使用“#pragma once”

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


【解决方案1】:

这个 std::operator- 是一个带有外部链接的内联函数。链接器似乎不支持此类内联函数的多个定义。但是 C++ (ODR) 的“单一定义规则”显然允许这样做。通常,此类符号会获得“弱链接”(GNU 术语),但我认为目标文件格式和链接器都需要支持这一点。

我会尝试在专门针对您的平台的群组/邮件列表中提出问题。类似于“平台 X 在链接方面是否支持 C++ 以及内联函数和模板的与 C++ 相关的单一定义规则?”。

您可能还想查看 GCC 文档。他们可能会提供命令行开关作为解决方法。如果您还没有使用 g++ 作为链接器的前端,您应该尝试一下。也许这也有帮助。

【讨论】:

    【解决方案2】:

    您是否尝试过使用#pragma once?

    【讨论】:

      【解决方案3】:

      我认为您只在一个头文件中包含了向量,但该头文件没有#define 块,这导致重新定义了包含在其中的向量头文件。 请将您的包含文件附在下面给出的模板中并尝试。

       #if !defined(HEADER_FILE) 
       #define HEADER_FILE
       // Your code
       #endif
      

      【讨论】:

      • 它通常更像 C/C++ 中的 #ifndef HEADER_FILE_H、#define HEADER_FILE_H 和 #endif
      【解决方案4】:

      由于链接过程中出现的问题,它看起来与模板实例化有关。鉴于实例化实现细节,模板函数/定义应放在公共包含文件中,以确保它们在任何地方都可见,并且不会重复标题包含此处可能出现的情况。

      从您发布的问题来看,操作员可能会被 std::distance() 使用,该操作员可能会从 find() 类型函数中调用。因此,请查看您是否定义或调用了此类函数,因为它们可能与向量和字符串一起使用,并确保它们位于共享头文件中。

      【讨论】:

        猜你喜欢
        • 2018-11-23
        • 2018-09-12
        • 1970-01-01
        • 2013-07-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多