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 格式。我认为
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 标志后
生成OMF导入库:implib -a inpout32.lib inpout32.dll
链接:链接 test.obj io.obj inpout32.lib
在此之后,我想尝试手动加载 DLL。谢谢大家花时间回答!
您可能需要摆弄 coff2omf 或类似工具的关于前导 _ 字符的标志(检查 lib 文件以确保符号包含它们)。
或者,您可能会发现使用 implib 实用程序直接从 .dll 生成 OMF 导入库更容易。
最后,如果您只需要使用少量函数,则使用