2010-09-04 24 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