在D中使用windows lib的正确方法?

时间:2012-07-10 20:58:06

标签: binding d parallel-port

我想为InpOut32 library编写C绑定。

首先,我为此库下载了binaries

其中有三个文件:

  • inpout32.lib
  • inpout32.h
  • inpout32.dll

这是我试图让D使用这个库。

//io.d

extern(C)
{
    void    Out32(short PortAddress, short data);
    short   Inp32(short PortAddress);
}

// test.d 

import std.stdio;
import io;

// parallel port address
short port = 0x0378;

void main()
{
    /* data */
    short data = 0b_00000000;
    Out32(port, data);
}

编译: dmd -c test.d io.d 结果:成功

链接链接test.obj io.obj inpout32.lib

但是当我尝试链接时,我收到此链接器错误:

  

适用于Win32版本8.00.12的OPTLINK(R)版权所有(C)数字火星

     

1989-2010保留所有权利。

     

http://www.digitalmars.com/ctg/optlink.html inpout32.lib Offset 00000H

     

记录类型0021错误138:模块或字典损坏

库文件可能是COFF格式。我认为coffimplib工具不是免费的,所以我使用了Borland的coff2omf工具来进行OMF格式化。转换后我仍然会遇到这样的链接器错误:

  

适用于Win32版本8.00.12的OPTLINK(R)

     

版权所有(C)Digital Mars 1989-2010保留所有权利。

     

http://www.digitalmars.com/ctg/optlink.html

     

test.obj(测试)    错误42:符号未定义_Out32

任何想法如何使用这个lib?感谢..


更新 今天我读了一篇关于为D编程语言创建C库绑定的interesting article

现在test.exe按预期工作。到目前为止,我已经完成了这些步骤。

编译: dmd -c -g test.d io.d

感谢Ali Çehreli提及-g选项。添加-g标志后access violation errors消失了。

生成OMF导入库: implib -a inpout32.lib inpout32.dll

链接链接test.obj io.obj inpout32.lib

在此之后,我想尝试手动加载DLL。感谢您抽出时间回答大家!

1 个答案:

答案 0 :(得分:2)

您可能需要使用关于前导_字符的coff2omf或类似工具的标记(检查lib文件以确保符号包含它们)。

或者,您可能会发现使用implib实用程序直接从.dll生成OMF导入库更容易。

最后,如果您只需要使用少量函数,使用LoadLibrary动态加载DLL并使用GetProcAddress获取函数地址将避免使用.lib文件的所有麻烦。