我目前有两个项目,该项目使用的应用程序和静态库。在我的静态库中,有一些类似的东西:
// interface.h
struct IInterface {
virtual ~IInterface() = default;
virtual void foo() = 0;
};
// baseclass.h
template < class T > struct BaseClass : public IInterface {
virtual ~BaseClass() = default;
virtual void foo() override final;
protected:
virtual void onFoo() = 0;
};
template < class T > BaseClass< T >::foo() {
// some other code here
onFoo();
}
// derivedclass.h
struct SomeStruct { /* ... */ };
struct DerivedClass : public BaseClass< SomeStruct > {
protected:
virtual void onFoo() override final;
}
// derivedclass.cpp
void DerivedClass::onFoo() {
// ...
}
在尝试将其编译为静态库后,一切正常。然后,我尝试实际将此库静态链接到我的应用程序并使用这些类,并在Visual Studio 2017中发生以下警告和错误:
Warning C4505 ... : unreferenced local function has been removed
继而导致链接器错误unresolved external symbol
。似乎编译器删除了foo
函数。这种代码有什么问题吗?为什么编译器认为我的函数是本地的且未引用?