如何使用导出C ++类的DLL使用延迟加载

我有一个DLL one.dll使用类two.dll通过class __declspec(dllexport)two.dll导出。 我想one.dll使用/delayload for two.dll ,但我得到一个链接错误:

 LINK : fatal error LNK1194: cannot delay-load 'two.dll' due to import of data symbol '"__declspec(dllimport) const TwoClass::`vftable'" (__imp_??_7TwoClass@@6B@)'; link without /DELAYLOAD:two.dll 

这是在发布版本; 在一个debugging版本的工作。 (我不知道在vtable导出方面版本和debugging之间有什么区别,我也不能find任何编译器开关或编译指令来控制它。)

我如何使用/delayload在一个发布版本中导出这样的类的DLL?

看看这里 ,似乎这个人有完全相同的问题,并找到一个解决方法

我设法通过禁用正在使用SomeClass类的翻译单元上的优化来获得延迟加载在发行版中的工作 – 不知何故,它取消了对导出的vtable的依赖。

检查one.dll是否包含一个包含TwoClass.hxx的源文件,但实际上并没有使用它。 另外检查TwoClass是否满足编译器生成方法的条件(请参阅自动生成条件 )。

在我的情况下,我实际上不需要一个编译器生成的副本,也不需要TwoClass的赋值操作符,所以我没有提供定义,而是在private:部分声明它们。 那为one.dll创建了构建错误,这引导我到不需要包含TwoClass.hxx的源文件。 删除不必要的包括我可以编译链接和优化打开和/ delayload。

我假设不必要的#include语句误导了优化器将编译器生成的TwoClass方法复制到.obj文件中,以便链接到one.dll中,即使这些文件没有在这些.obj文件中使用。 这些不必要的编译器为TwoClass生成的方法似乎阻止了/ delayload链接。

定义一个派生类的实例的工厂函数,就像在COM中一样。 这也要求类的接口是公开的,但是当有人输入一个类的时候也是这样。

我有类似的问题,其中包含内联实现导出的类。

 class __declspec(dllimport) VidExpInternal : public VidExpBase { public: VidExpInternal(TCHAR* msg=_T(""), int ln=__LINE__, TCHAR* filechar=_T(__FILE__)) : VidExpBase (msg,ln,filechar) {} 

我已经将内联实现移动到.cpp文件 – 之后,一切顺利。

 class __declspec(dllimport) VidExpInternal : public VidExpBase { public: VidExpInternal(TCHAR* msg=_T(""), int ln=__LINE__, TCHAR* filechar=_T(__FILE__));