4

と の 2 つのファイルがMain.dありImportMe.dます。それらの目的は自明であるべきです。それらは同じディレクトリにあり、明示的なモジュール宣言はありません。ただし、コンパイルしようとするとMain.d、「シンボルが見つかりません」というエラーが発生します。

$ dmd Main.d -I.

Undefined symbols:
  "_D8ImportMe12__ModuleInfoZ", referenced from:
      _D4Main12__ModuleInfoZ in Main.o
  "_D8ImportMe8SayHelloFxAyaZv", referenced from:
      __Dmain in Main.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
--- errorlevel 1

両方のファイルを同時にコンパイルしても問題ありません。

$ dmd Main.d ImportMe.d

ただし、標準ライブラリでこれを行う必要はありません。何が違うのですか?インクルード パスを変更し-Iても目に見える効果はありません。

4

2 に答える 2

5

モジュールをコンパイルするとき、dmd には、そのモジュールがそのインポート パスで必要とするすべてのモジュールの .d ファイルまたは .di ファイルが必要です。-Iインポート パスにパスを追加できます。ただし、それでは他のモジュールはビルドされません。ビルドを要求したモジュールをビルドするために必要なものを dmd に与えるだけです。また、リンクするとき、dmd は、プログラムで使用されているすべてのモジュールのオブジェクト ファイルまたはライブラリ バイナリのいずれかを必要とします。そうしないと、未定義のシンボルについてエラーが発生-Lします (ライブラリでリンクする場合は、リンカー フラグに使用できます)。リンク手順では C リンカを使用するため、D にまったく対応しておらず、モジュールについて何も認識していません。

したがって、2 つのステップでコンパイルおよびリンクする場合は、最初に各モジュールを個別に、または他のモジュールと一緒にコンパイルし、コンパイラに渡すフラグに応じて、オブジェクト ファイルまたはライブラリ ファイルのいずれかを生成します (オブジェクト ファイルがデフォルトです)。次に、リンク段階でこれらのオブジェクト ファイルとライブラリをリンクし、実行可能ファイルを生成します。

-cまたはを渡さずに dmd を使用する-libと、コンパイルとリンクの両方が行われるため、コンパイルする予定のすべてのモジュールを提供する必要があります。未定義のシンボル。コンパイルするように要求したモジュールがインポートするすべてのモジュールを魔法のようにコンパイルするわけではありません。そのような動作が必要な場合は、rdmd などのツールを使用する必要があります。

dmd.conf (Posix の場合) または sc.ini (Windows の場合) により、dmd は指定しなくても druntime と Phobos を見つけることができます。その構成ファイルは、適切な .d および .di ファイルをインポート パスに追加し、(プラットフォームに応じて) libphobos.a または phobos.lib を追加します。DFLAGSこれにより、dmd は、モジュールをコンパイルするときにそれらのモジュールを見つけ、次のライブラリにリンクできます。リンクフェーズ。また、標準ライブラリが機能するために必要なその他のフラグ (Linux の librt でのリンクなど) も追加します。これらのファイルのいずれかを非標準の場所に移動した場合、dmd が引き続きそれらを見つけられるようにするために変更する必要があるのは、その構成ファイルです。

于 2011-10-11T04:49:58.147 に答える
4

コンパイラはプリコンパイル済みの標準ライブラリ .lib ファイルをリンカに暗黙的に渡すため、標準ライブラリからモジュールを指定する必要はありません。独自のプロジェクトでは、rdmdまたは別のビルド ツールの使用を検討してください。

于 2011-10-11T01:23:41.157 に答える