我有一个导出
的dllextern "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.exe Foo @ 0是Foo的别名,它仍会创建一个导入库,尝试按名称加载“Foo @ 0”。
当我要求“Foo @ 0”时,有没有办法让导入库加载“Foo”?
谢谢,
大卫
答案 0 :(得分:4)
您有正确的想法尝试使用别名......
“似乎LIB不接受别名形式(它只会忽略等号后的部分); 2)它假定DEF文件中的所有函数__cdecl。第二点在于导入库它的事实produce会将DLL中的每个符号映射到带有下划线前缀的内部名称,即使用导入库的链接器将尝试将未定义的符号_Function解析为DLL中的符号Function。它不需要特别注意__stdcall调用使用一些技术,我们可以使用LIB为__stdcall函数生成导入库,但是调用者只能按顺序调用它们,而不能按名称调用它们。详细信息留作练习:-)。“ (http://wyw.dcweb.cn/stdcall.htm)
而不是使用别名使用序数:(使用您的示例):
LIBRARY simple.dll
EXPORTS
Foo
Foo@0 @2 ;(from your dumpbin)
为我工作:)