关于绑定:在 D 中使用 windows 库的正确方法?

Correct way of using a windows lib in D?

我想为 InpOut32 库编写 C 绑定。

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

里面有三个文件:

  • inpout32.lib
  • 输入32.h
  • inpout32.dll

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

1
2
3
4
5
6
7
//io.d

extern(C)
{
    void    Out32(short PortAddress, short data);
    short   Inp32(short PortAddress);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 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 结果:成功l

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

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

OPTLINK (R) for Win32 Release 8.00.12 Copyright (C) Digital Mars

1989-2010 All rights reserved.

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

Record Type 0021 Error 138: Module or Dictionary corrupt

库文件可能是 COFF 格式。我认为 coffimplib 工具不是免费的,所以我使用了 Borland 的 coff2omf 工具转为 OMF 格式。转换后我仍然收到如下链接器错误:

OPTLINK (R) for Win32 Release 8.00.12

Copyright (C) Digital Mars 1989-2010 All rights reserved.

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

test.obj(test)
Error 42: Symbol Undefined _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。谢谢大家花时间回答!


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

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

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