这已经在很多地方进行了部分讨论,但它仍然对我不起作用。
我有一个从 delphi 源代码编译的 dll,它以两个名称导出一个函数,使用检查 dll
>> dumpbin /EXPORTS MyLibrary.dll
我得到以下输出:
...
17 3 00070A88 MyFunction
...
46 24 00070A88 _MyFunction@48
...
所以我创建了一个名为 MyLibrary.def 的文件,其内容如下:
EXPORTS
MyFunction
_MyFunction@48
并使用生成了一个导入库
>> lib /def:MyLibrary.def /OUT:MyLibrary.lib /MACHINE:x86
使用 dumpbin 检查新的 lib 文件,我看到以下内容:
...
_MyFunction
...
__MyFunction@48
...
所以不知何故,lib 应用程序在函数名称前添加了一个下划线。(为什么?)
然后我尝试在 c++ 程序中使用这个函数,用 Microsoft Visual Studio C++ 2010 Express 编译(使用 lib 文件):
// MyLibrary.h
# define DllImport(Type) __declspec (dllimport) Type __stdcall
extern "C" DllImport(void)MyFunction(...);
// main.cpp
#import "MyLibrary.h"
...
MyFunction(....);
...
据我所知,这现在应该可以工作,但是我收到以下链接器错误:
... error LNK2001: Unresolved external sympol "__imp__MyFunction@48".
我不明白为什么会出错(我真的不明白整个事情是如何运作的......)但我又尝试了两件事。
- 将 MyLibrary.h 和 main.h 中的函数从 MyFunction 重命名为 _MyFunction
- 结果:有效!但为什么?我不想依赖这个,因为有些事情显然是错误的。
- 将我的函数重命名为 MyFunction 并删除了 def-File 中的下划线,再次生成 lib 文件并尝试编译
- 结果:编译成功,但启动程序时我得到
MyApp - Entry Point Not Found
---------------------------
The procedure entry point MyFunction@48 could not be located
in the dynamic link library MyLibrary.dll.
我认为需要对 lib 工具和链接器的内部工作有更深入的了解,但到目前为止我找不到任何关于此的信息。