我有一个DLL one.dll,它使用通过class __declspec(dllexport)从two.dll导出的类TwoClass。我希望one.dll在two.dll中使用/delayload,但我得到了一个链接错误:
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这是在发布版本中;在调试版本中,它是有效的。(我不知道Release和Debug在vtable导出方面有什么区别,也找不到任何编译器开关或编译指示来控制它。)
在发布版本中,如何将/delayload与导出类似类的DLL一起使用?
发布于 2011-03-08 21:32:09
看一下here,这个人似乎有完全相同的问题,并找到了解决方法
通过禁用对使用SomeClass类的翻译单元的优化,我设法使延迟加载在发布版本中工作--不知何故,它消除了对导出的
的依赖。
发布于 2014-01-18 20:28:27
检查one.dll是否包含包含TwoClass.hxx但实际上并不使用它的源文件。此外,检查TwoClass是否满足编译器生成的方法的条件(参见conditions for automatic generation)。
在我的例子中,我实际上不需要编译器生成的复制ctor,也不需要TwoClass的赋值操作符,所以我在private:部分声明了它们,而没有提供定义。这为one.dll创建了构建错误,这引导我找到了不必要地包含TwoClass.hxx的源文件。在删除了不必要的includes之后,我能够编译和链接,并打开优化和使用/delayload。
我假设不必要的#include语句误导优化器将编译器生成的TwoClass方法复制到要链接到one.dll的.obj文件中,即使这些.obj文件中没有使用这些方法。这些不必要的编译器为TwoClass生成的方法似乎阻止了与/delayload的链接。
发布于 2011-03-08 21:55:54
定义一个工厂函数,它分发类的实例,就像在COM中一样。这也要求类的接口是公共的,但当有人导入一个类时,这也是给定的。
https://stackoverflow.com/questions/5232912
复制相似问题