7

我真的很想深入了解 D,但缺乏良好的库支持确实阻碍了我。因此,我想为我想使用的现有 C 库创建一些 D 绑定。我从来没有做过任何绑定,但它看起来也不是太难。

我打算为 D2 做这个(不是专门为 D1 做的,但如果两者都适用,那就更好了)。我正在使用 DMD2 编译器。

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

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

谢谢!

4

2 回答 2

4

需要注意的几点:

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

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

就示例而言,可以在 druntime 中查看一个地方,其中包含整个 C 标准库的绑定。

于 2010-09-04T16:21:56.613 回答
1

你可以看看 Aldacron 如何处理Derelict2

于 2010-09-10T00:35:18.640 回答