6

我有一个导出的 dll

extern "C" __declspec(dllexport) int __stdcall Foo( void );

dll转储显示

******************************************************************************
Section:             Exports
File Offset:         00001400 (5120)
  Flags:             00000000
  Time Stamp:        00000000
  Major Version:     0000
  Minor Version:     0000

Exports from simple.dll
  3 exported name(s), 3 export addresse(s).  Ordinal base is 1.
  Sorted by Name:
    RVA      Ord. Hint Name
    -------- ---- ---- ----
    00002104    3 0000 std::nothrow
    00001258    2 0001 Foo
    000020F8    1 0002 ___CPPdebugHook

******************************************************************************

我从以下 def 文件开始:

LIBRARY simple.dll 
EXPORTS
  Foo

这创建了一个包含以下导出的 lib 文件:

Exports
       ordinal    name
                  _Foo

当我与这个库链接时,msvc 链接器抱怨它找不到 _Foo@0。为了纠正这个问题,我在 def 文件中添加了一个别名。

LIBRARY simple.dll 
EXPORTS
  Foo
  Foo@0=Foo

这会产生一个带有导出的 lib 文件

Exports
       ordinal    name
                  _Foo
                  _Foo@0

现在项目链接没有任何问题。但是,当我尝试运行它时,我收到了消息

“无法在动态链接库 simple.dll 中找到过程入口点 Foo@0”

所以看起来即使我告诉 lib.exe Foo@0 是 Foo 的别名,它仍然会创建一个尝试按名称加载“Foo@0”的导入库。

当我要求“Foo@0”时,有没有办法让导入库加载“Foo”?

谢谢,

大卫

4

1 回答 1

5

您尝试使用别名的想法是正确的...

“似乎 LIB 不接受别名形式(它会简单地忽略等号后面的部分);2)它假定 DEF 文件中的所有函数 __cdecl。第二点在于它生成的导入库将映射DLL 中的每个符号都转换为带有下划线前缀的内部名称,即使用导入库的链接器将尝试将未定义的符号 _Function 解析为 DLL 中的符号 Function。它不特别注意 __stdcall 调用约定。我们可以使用 LIB 为 __stdcall 函数生成导入库的一些技术,但调用者只能按序号而不是按名称调用它们。细节留作练习 :-)。( http://wyw.dcweb.cn/stdcall.htm )

不要使用别名,而是使用序数:(使用您的示例):

LIBRARY simple.dll 
EXPORTS
     Foo
     Foo@0    @2 ;(from your dumpbin)

为我工作:)

于 2010-03-30T18:22:26.020 回答