C++ dllexport纯虚拟类与专用实现不工作?
我有一个正在移植到Windows/MSVC的库。该库是C++,并使用以下模式来隐藏实现。我正在尝试使用建议的方法导出类声明中带有C++ dllexport纯虚拟类与专用实现不工作?,c++,windows,dllexport,C++,Windows,Dllexport,我有一个正在移植到Windows/MSVC的库。该库是C++,并使用以下模式来隐藏实现。我正在尝试使用建议的方法导出类声明中带有dllexport的整个类 #define API __declspec(dllexport) class API Something { public: static Something * instantiate(); void doSomething() = 0; // etc }; 然后是一个私有实现,它实现了静态工厂方法和所有其
dllexport
的整个类
#define API __declspec(dllexport)
class API Something
{
public:
static Something * instantiate();
void doSomething() = 0;
// etc
};
然后是一个私有实现,它实现了静态工厂方法和所有其他方法
// SomethingImpl.h
class SomethingImpl : public Something
{
//... normal overrides
}
// SomethingImpl.cpp
Something * SomethingImpl::instantiate()
{
return new SomethingImpl();
}
void SomethingImpl::doSomething()
{
// something great
}
但是,当我想将DLL链接到我的应用程序时,链接器(LNK2019)找不到所有这些符号。我想,因为它们是纯虚拟方法,所以它假定它们是不需要的?有什么提示吗
其他更普通的类正在链接OK,当我在dependency walker中看到DLL时,这些类的符号肯定不在那里
谢谢您的假设在某种意义上是正确的,即基类(
Something
)没有导出。更具体地说,没有为基类生成实际代码(因为它是一个纯虚拟类)。因此,没有可以导出的符号
但是,在派生类(SomethingImpl
)上,您必须为dll的使用者dllexport私有实现。派生类不继承基类的dllexport。但您必须导出这些符号,以便允许消费者实际使用此代码。这并不意味着您的实现细节对消费者“公开”
例如,假设dll的使用者声明了一个类,其成员类型为Something
。当此类调用Something::instantiate()
时,链接器需要知道需要调用哪个实际地址。因此,必须导出您的实现