我有一个小dll,我想用D语言。我假设它已用C语言编写。这些是我可以访问的文件,它们与我的程序存在于同一目录中。:
这是我试图让D使用这个dll。
test.d
pragma(lib, "blitz3dsdk.lib");
int main(string[] Args)
{
bbBeginBlitz3D();
bbEndBlitz3D();
return 0;
}
编译: dmd test.d -w -wi -debug
结果: Error 43: Not a Valid Library File.
Blitz3DSDK.d
module Blitz3DSDK;
// __declspec(dllimport) int bbBeginBlitz3D() - from the header file.
export extern (Windows) int bbBeginBlitz3D();
// __declspec(dllimport) void bbEndBlitz3D() - from the header file.
export extern (Windows) void bbEndBlitz3D();
test.d
import Blitz3DSDK;
int main(string[] Args)
{
bbBeginBlitz3D();
bbEndBlitz3D();
return 0;
}
编译: dmd test.d -w -wi -debug
结果: Error 42: Symbol Undefined _bbBeginBlitz3D@0
Error 42: Symbol Undefined _bbEndBlitz3D@0
任何有关如何使用此dll或任何有用的最新在线指南的想法将不胜感激。这已经有一段时间了,因为我已经摆弄了本机代码和共享库等。
答案 0 :(得分:5)
库文件可能是COFF格式。使用coffimplib
将其转换为可与D的链接器一起使用的OMF库,或implib
从DLL创建导入库。
export
,而不是导入它们。
答案 1 :(得分:0)
按照CyberShadow的建议,我使用coffimplib
工具将blitz3dsdk.lib
文件转换为OMF格式并使用编译指示导入。然后我在extern (C)
块中定义了它包含的外部函数。
示例:
pragma(lib, "new.lib");
extern (C)
{
int bbBeginBlitz3D();
void bbEndBlitz3D();
}
int main(string[] Args)
{
bbBeginBlitz3D();
bbEndBlitz3D();
return 0;
}
我已经尝试了这个dll中的一些函数,遵循this page的指南来转换某些类型等,并且一切都很好。