从使用stdcall的DLL创建MSVC导入库
我有一个可导出的dll从使用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
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)