2010-09-04 41 views
6

我真的想进一步深入研究D,但缺乏良好的库支持实际上阻碍了我。因此,我想为我想要使用的现有C库创建一些D绑定。我从来没有做过任何绑定,但它也不太难。为现有的C库编写一个D(D2)绑定

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

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

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

谢谢!

+0

Windows? ______ – kennytm 2010-09-04 15:59:14

+0

是的,Windows(x86)。尽管我的目标是在可能的情况下使事物变得可移动...... – 2010-09-04 16:08:02

+0

出于好奇,您希望移植哪些库? – 2010-09-04 19:30:02

回答

4

有几件事情需要注意:

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

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

至于例子,一个地方寻找将是druntime,which contains bindings for the entire C standard library.

+0

谢谢。我认为现在我的界面非常清晰。所以,一种方法是从C创建一个由接口文件和OMF对象文件组成的项目,然后将它们编译为一个.lib文件? .lib将被链接到,并且接口文件被“导入”。 虽然(很多用户的重新编译?)很难分发,但很容易使用。 – 2010-09-04 17:14:44

+0

druntime转移到github,[新链接](https://github.com/D-Programming-Language/druntime/tree/master/src/core/stdc)。还有IIUC,[D合并C绑定项目](https://github.com/D-Programming-Language/deimos) – 2011-10-25 00:49:56

+0

一些[关于异地的提示](http://www.dpl.org /htomodule.html) – 2011-10-25 01:06:07