C++ 如何使用导出C++;班级

C++ 如何使用导出C++;班级,c++,windows,visual-studio,dll,vtable,C++,Windows,Visual Studio,Dll,Vtable,我有一个DLLone.DLL,它使用从two.DLL通过class\uu declspec(dllexport)导出的类two class。我希望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'" (

我有一个DLL
one.DLL
,它使用从
two.DLL
通过
class\uu declspec(dllexport)
导出的类
two class
。我希望
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
这是在一个发布版本中;在调试构建中,它可以工作。(我不知道在vtable导出方面Release和Debug之间有什么区别,也找不到任何编译器开关或pragma来控制它。)

我如何将
/delayload
与在发布版本中导出类似类的DLL一起使用?

看一看,似乎此人遇到了完全相同的问题,并找到了解决方法

我设法得到了延迟加载 通过禁用 使用某个类的翻译单元-不知何故它带走了 对导出vtable的依赖关系


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

检查one.dll是否包含包含TwoClass.hxx但实际未使用的源文件。此外,检查TwoClass是否满足编译器生成的方法的条件(请参阅)

在我的例子中,实际上我不需要编译器生成的copy-ctor,也不需要TwoClass的赋值运算符,所以我在
private:
部分声明了它们,但没有提供定义。这为one.dll创建了构建错误,从而引导我找到不必要地包含TwoClass.hxx的源文件。在删除不必要的include之后,我能够在打开优化和/delayload的情况下编译和链接


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

对于包含导出类的内联实现的类,我遇到了完全相同的问题

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__));

是的。在类上使用
\uu declspec(dllexport)
是一个可怕的想法,最好是公开接口并让实现细节隐藏在模块内。这是一种更好的样式,但这能解决
延迟加载的OP问题吗?@davka:是的。这样做的原因很简单:在这种方法中只导出函数,而不导出数据(这最终是延迟加载的问题)。解决方法是关闭优化,优化确实有效,但并不理想-我必须在代码的很大一部分中进行。如果有某种方法可以控制影响vtables的特定优化,那就太好了,但我找不到。@RichieHindle-同意,这就是为什么我没有称之为解决方案:)似乎这可能是由需要的优化引起的-另请参见(类是否与继承相关,特别是MI?)将
Remove unreferenced code and data
选项设置为No可使我保持启用优化@MSalters:否,VS2005(目前;希望在某个时候移到2010年)。