Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ dllexport纯虚拟类与专用实现不工作?_C++_Windows_Dllexport - Fatal编程技术网

C++ dllexport纯虚拟类与专用实现不工作?

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 }; 然后是一个私有实现,它实现了静态工厂方法和所有其

我有一个正在移植到Windows/MSVC的库。该库是C++,并使用以下模式来隐藏实现。我正在尝试使用建议的方法导出类声明中带有
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()
时,链接器需要知道需要调用哪个实际地址。因此,必须导出您的实现