为现有C库编写D(D2)绑定

Tac*_*lff 6 c binding d dmd

我真的很想进入D,但缺乏良好的图书馆支持真的会阻碍我.因此,我想为我想要使用的现有C库创建一些D绑定.我从未做过任何约束,但看起来也不太难.

我打算为D2做这个(不是特别是D1,但如果它可以用于两者,甚至更好).我正在使用DMD2编译器.

  • 应该使用哪些约定(我注意到版本语句,别名和常规常量/函数定义)?
  • 绑定到静态库(因此链接到)或动态库之间的区别是什么?绑定有什么区别吗?
  • 对于绑定静态库,DMD编译器似乎不接受.a或.o文件,仅接受.lib和.obj.这是否意味着必须使用DMC编译器(而不是GCC编译器)编译库,然后通过DMD编译器进行链接?

如果某人有一个非常简短的例子来说明如何完成一个绑定,我会非常满意.目前我可以使用DMC编译C代码,链接目标文件并从D中的C代码运行函数.但是,大多数C库只需要包含头文件并且需要在C中链接.我不确定如何制作适用于那个的绑定......

谢谢!

dsi*_*cha 4

有几点需要注意:

  1. DMD 及其链接器 Optlink 使用较旧的 OMF 目标文件格式,而不是 COFF。这意味着您链接的 C 文件也必须是 OMF。如果你不想使用DMC,有一些工具可以将COFF转换为OMF,尽管我不知道它们的详细信息。

  2. 至于将 .h 文件转换为 .d 文件,DMD 中包含一个名为 htod 的实用程序,它将为您完成此转换,尽管如果您严重滥用预处理器,则可能会有些不完美。通常,您使用constimmutable、 或 来enum表示清单常量,version使用语句来进行条件编译,使用常规(可能是模板化)函数来表示宏函数。

就示例而言,一个值得一看的地方是 druntime,其中包含整个 C 标准库的绑定。