11

我有一个 DLL one.dll,它使用从viaTwoClass导出的类。我想使用for ,但出现链接错误:two.dllclass __declspec(dllexport)one.dll/delayloadtwo.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

那是在发布版本中;在调试版本中它可以工作。(我不知道 Release 和 Debug 在 vtable 导出方面有什么区别,也找不到任何编译器开关或编译指示来控制它。)

如何/delayload在发布版本中使用导出此类类的 DLL?

4

4 回答 4

6

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

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

于 2011-03-08T13:32:09.407 回答
1

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

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

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

于 2014-01-18T12:28:26.507 回答
0

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

于 2011-03-08T13:55:53.880 回答
0

我对包含导出类的内联实现的类有完全相同的问题。

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__));
于 2016-10-25T12:01:30.377 回答