7

Linux に DMD + Tango バンドルがあります。たとえば、Dで外部ライブラリを使用するにはどうすればよいですかzlib。zlibをコンパイルしました。

次のようなファイル ツリーがあります。

myzlib
├── include
│   ├── zconf.h
│   └── zlib.h
└── lib
    └── libz.a

私は私のソースでimport tango.io.compress.ZlibStream;電話を受けました。myfile.d

そして、これらは私の質問です:

  1. これらのファイルをdmd/libディレクトリにコピーする必要がありますか?
  2. ファイルを変更する必要がありdmd/bin/dmd.confますか?
  3. dmdコンパイラ ( ) など (おそらく絶対パスを使用)を呼び出すにはどうすればよいdmd myfile.d -Llibz.aですか?

他の言語で外部ライブラリを使用しようとしたことはありません。私を助けてください。

4

2 に答える 2

8

この-Lフラグは、特定のディレクトリを検索パスに追加するようリンカーに指示します。

-l特定のライブラリにリンクするように指示し、検索パスを検索してそのライブラリを見つけます。

DMD では、フラグを使用してリンカーにフラグを渡す必要があります-L。絶対パスまたは相対パスのいずれかを取ることができますが、パスは、コンパイラの実行元からの相対パスである必要があります。したがって、相対パスを使用する場合は、常に同じディレクトリからコンパイラを実行する必要があります(通常、ビルド コマンドは常に同じディレクトリから実行するため、これは通常は問題になりませんMakefile)

最も一般的なのは、システムにインストールされているライブラリには絶対パスを使用し、プロジェクトに固有のライブラリには相対パスを使用することです。

したがって、ライブラリがある場合は、myzlib/lib/libz.aに渡し-L-Lmyzlib/lib -L-lzますdmd

myzlib/lib次に、リンカーの検索パスに追加しlibz.a、その検索パスで検索します(リンカーは、次の部分を取り、-lその前に lib を追加.aし、最後にサフィックスを追加して、探しているライブラリを取得することを知っていますのために)

リンカ フラグを に追加できますが、おdmd.conf勧めしません。のフラグdmd.confは、dmdがすべてのプログラムで常に使用するものです。したがって、実際には、すべてのプログラムで使用されるフラグのみが必要です。

むしろ、それらを dmd に直接フィードします (コマンドライン上または a の一部としてMakefile)。

ヘッダー ファイルに関しては、必要な宣言をファイルに複製する必要があり.dます。

ヘッダー ファイルは、リンカーではなく、C または C++ コンパイラによって使用されます。D は、C または C++ で使用するのと同じリンカを共有しますが、そのコンパイラはdmdであり、gcc.

したがって、C 宣言を D ファイルに複製する必要があります。これを行う最も簡単な方法はhtodutilityを使用することですが、Windows または Wine でのみ機能します。

とにかく、.dファイルで使用する C 宣言を宣言し、extern(C).

于 2011-02-20T11:23:29.357 に答える
1

コンパイルとリンクのステップを別々に行うようにビルドをセットアップする場合 (c で行うのが一般的であるように)、C で同じことを行うのと本質的に同じです。必要なすべてのフラグをリンカーに渡します)、通常どおりライブラリを追加します。D から C ライブラリを使用するには、バインディング ファイルが必要です。バインディング ファイルは、事実上、プロトタイプのみで構成される単なる D ファイルです。

于 2011-02-20T17:34:00.337 に答える