3

我想为InpOut32 library编写 C 绑定。

首先,我为这个库下载了二进制文件。

里面有三个文件:

  • inpout32.lib
  • 输入32.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

但是当我尝试链接时,我得到了这个链接器错误:

OPTLINK (R) for Win32 Release 8.00.12 版权所有 (C) Digital Mars

1989-2010 保留所有权利。

http://www.digitalmars.com/ctg/optlink.html inpout32.lib 偏移量 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(test) 错误 42:符号未定义 _Out32

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


更新: 今天我读到一篇有趣的文章,关于为 D 编程语言创建与 C 库的绑定。

现在 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。谢谢大家花时间回答!

4

1 回答 1

2

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

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

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

于 2012-07-11T12:58:17.070 回答