我有一个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__));