首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何对导出C++类的DLL使用延迟加载

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

Stack Overflow用户
提问于 2011-03-08 21:11:04
回答 4查看 6.8K关注 0票数 11

我有一个DLL one.dll,它使用通过class __declspec(dllexport)two.dll导出的类TwoClass。我希望one.dlltwo.dll中使用/delayload,但我得到了一个链接错误:

代码语言:javascript
复制
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一起使用?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-03-08 21:32:09

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

通过禁用对使用SomeClass类的翻译单元的优化,我设法使延迟加载在发布版本中工作--不知何故,它消除了对导出的

的依赖。

票数 6
EN

Stack Overflow用户

发布于 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的链接。

票数 1
EN

Stack Overflow用户

发布于 2011-03-08 21:55:54

定义一个工厂函数,它分发类的实例,就像在COM中一样。这也要求类的接口是公共的,但当有人导入一个类时,这也是给定的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5232912

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档