【发布时间】: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