【问题标题】:C++ linker warning because of virtual destructor / clang由于虚拟析构函数/clang 导致 C++ 链接器警告
【发布时间】:2017-05-01 07:44:41
【问题描述】:

我收到了由虚拟析构函数引起的链接器警告。我的环境是 KEIL 编译器 v6.5 (clang)。

Warning: L6439W: Multiply defined Global Symbol __clang_call_terminate defined in invalid_group(new.cpp.o) rejected in favor of Symbol defined in .text.__clang_call_terminate(cxa_handlers.cpp.o).

我将虚拟析构函数添加到接口后立即收到此警告。例如:

class IInterface {
  virtual ~IInterface(){}

  virtual void doSomething() const = 0;
}

一旦我实现了这个接口的一个派生类,我就会收到上面提到的警告。一旦我删除了虚拟析构函数,警告就会消失。

我尝试了很多方法来找出原因,但没有成功......

有人知道如何解决这个警告吗?

谢谢!

编辑:抛出此警告的完整示例:

class IInterface {
  public:
  virtual ~IInterface();

  virtual void doSomething() = 0;
};

IInterface::~IInterface() {

}

class SomeClass : public IInterface {
  public:
  virtual void doSomething();
};

void SomeClass::doSomething() {

}

int main() {

}

【问题讨论】:

  • 你可以试试virtual ~IInterface() = default;吗?
  • 您是否在基类和派生类中都提供了析构函数的实现?纯虚析构函数需要一个实现,尽管它是纯虚的。
  • @n.m.看起来它是在基类中实现的,如果没有用户提供的,派生的将使用默认的 dtor。
  • @vsoftco 没有解决问题。
  • 当您在头文件中有某些内容但未将其包装在标头保护中时,通常会出现该错误。有趣的是,您正设法从您的完整示例中获取它,大概都在一个 *.cpp 文件中。

标签: c++ c++11 clang clang++ llvm-clang


【解决方案1】:

如果您在标头中定义函数,则每次将其包含在文件中时都会发出该函数。要消除这种变暖,您需要在声明之外定义您的方法

// IInterface.hpp
class IInterface {
public:
  virtual ~IInterface();
}

// IInterface.cpp
IInterface::~IInterface() {}

【讨论】:

  • 实际上,如果定义在类内部(如在顶部 sn-p 中),它是内联的,所以它应该可以正常工作(当然假设正确包含警卫)。
【解决方案2】:

我请求了 ARM 的支持,并得到了这个警告是虚假的信息。所以这似乎是当前 ARM clang 编译器工具链实现的问题。

不过,感谢大家对此主题的回复。

【讨论】:

    【解决方案3】:

    如前所述,这是一个链接器错误,已在 ARM Compiler v6.11 (10/25/2018) 中修复。

    发行说明:

    [SDCOMP-30157] 在某些情况下,从 COMDAT ELF 节组中丢弃节后,链接器可能会错误地报告警告:L6439W:在 invalid_group() 中定义的乘以定义的全局符号被拒绝以支持在 () 中定义的符号.此问题已修复。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-03
      • 2021-03-14
      • 2021-11-30
      • 1970-01-01
      • 2016-10-15
      • 1970-01-01
      • 2011-08-12
      • 1970-01-01
      相关资源
      最近更新 更多