我想为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。谢谢大家花时间回答!