我想为InpOut32 library编写C绑定。
首先,我为此库下载了binaries。
其中有三个文件:
这是我试图让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。感谢您抽出时间回答大家!
答案 0 :(得分:2)
您可能需要使用关于前导_字符的coff2omf或类似工具的标记(检查lib文件以确保符号包含它们)。
或者,您可能会发现使用implib实用程序直接从.dll生成OMF导入库更容易。
最后,如果您只需要使用少量函数,使用LoadLibrary
动态加载DLL并使用GetProcAddress
获取函数地址将避免使用.lib文件的所有麻烦。