从使用stdcall的DLL创建MSVC导入库

从使用stdcall的DLL创建MSVC导入库,dll,import,visual-c++,stdcall,Dll,Import,Visual C++,Stdcall,我有一个可导出的dll extern "C" __declspec(dllexport) int __stdcall Foo( void ); 显示dll的转储 ****************************************************************************** Section: Exports File Offset: 00001400 (5120) Flags: 00

我有一个可导出的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
现在项目链接没有任何问题。然而,当我尝试运行它时,我得到了消息

“程序入口点Foo@0在动态链接库simple.dll中找不到“

看来即使我告诉lib.exeFoo@0是Foo的别名,它仍会创建一个导入库,尝试加载“Foo@0“叫名字

有没有办法让导入库在我请求“Foo”时加载“Foo”Foo@0“

谢谢


大卫

你想用化名是对的

“LIB似乎不接受别名形式(它只会忽略等号后面的部分);2)它假定DEF文件_cdecl中的所有函数。第二点在于,它生成的导入库将把DLL中的每个符号映射到一个带有下划线前缀的内部名称,即,使用导入库的链接器将尝试将未定义的符号_函数解析为DLL中的符号函数。它不需要规范ial关注u stdcall调用约定。通过一些技术,我们可以使用LIB为u stdcall函数生成导入库,但调用方只能按序号调用它们,而不能按名称调用它们。详细信息留作练习:-)。“()

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


为我工作:)

工作起来很有魅力!正是我需要的。令人惊讶的是,微软让创建导入库变得如此困难。谢谢
LIBRARY simple.dll 
EXPORTS
     Foo
     Foo@0    @2 ;(from your dumpbin)