7

D をもっと使いこなしたいのですが、適切なライブラリ サポートがないことが妨げになっています。したがって、使用したい既存の C ライブラリ用の D バインディングをいくつか作成したいと思います。バインディングはやったことないけど、難しそうでもない。

私はこれを D2 に対して行う予定です (具体的には D1 ではありませんが、両方に対して行うことができれば、さらに良いでしょう)。DMD2 コンパイラを使用しています。

  • どのような規則を使用する必要がありますか (バージョン ステートメント、エイリアス、および通常の定数/関数定義に気付きました)?
  • 静的ライブラリへのバインド (したがってリンク) と動的ライブラリの違いは何ですか? 結び方に違いはありますか?
  • 静的ライブラリをバインドする場合、DMD コンパイラは .a ファイルまたは .o ファイルを受け入れないようで、.lib および .obj のみを受け入れます。これは、ライブラリを (GCC コンパイラではなく) DMC コンパイラでコンパイルし、DMD コンパイラを介してリンクする必要があるということですか?

誰かがバインディングがどのように達成されるかの非常に短い例を持っていれば、私はとてもいっぱいになるでしょう. 現在、DMC で C コードをコンパイルし、オブジェクト ファイルをリンクし、D で C コードから関数を実行できます。しかし、ほとんどの C ライブラリは、ヘッダー ファイルのインクルードと、C でリンクする必要があるだけです。そのために機能するバインディング...

ありがとう!

4

2 に答える 2

4

注意すべき点がいくつかあります。

  1. DMD とそのリンカ Optlink は、COFF ではなく、古い OMF オブジェクト ファイル形式で動作します。これは、リンク先の C ファイルも OMF である必要があることを意味します。DMC を使いたくない場合は、COFF を OMF に変換するツールがありますが、詳細はわかりません。

  2. .h ファイルを .d ファイルに変換する限り、htod と呼ばれるユーティリティが DMD にパッケージ化されており、プリプロセッサをひどく乱用すると多少不完全ではありますが、この変換が行われます。通常、マニフェスト定数にはconstimmutable、またはを使用し、条件付きコンパイルにはステートメントを使用し、マクロ関数には通常の (場合によってはテンプレート化された) 関数を使用します。enumversion

例としては、C 標準ライブラリ全体のバインディングを含むdruntime を参照してください。

于 2010-09-04T16:21:56.613 に答える
1

AldacronがDerelict2でどのように機能するかをご覧ください。

于 2010-09-10T00:35:18.640 に答える