2012-06-20 10 views
6

D(言語リリース2)でインポートする基本モジュールを使用しようとしています。ガイドとして、私はdlang.orgの例を使用しましたが、私の単純なプログラムはコンパイルされません。ファイルは同じディレクトリにあります。ここでモジュールのインポートD

は私のmain.dファイルの内容です:

import std.stdio; 
import mymodule; 

void main(string[] args){ 
    sayHello(); 
    writeln("Executing Main"); 
} 

そして、ここでは私のモジュールファイルの内容(mymodule.d)は次のとおりです。私はbashのを介して実行されるコンパイルするに

void sayHello(){ 
    writeln("hello"); 

} 

dmd main.d 

エラー出力は次のとおりです。

main.o: In function `_Dmain': 
main.d:(.text._Dmain+0x5): undefined reference to `_D8mymodule8sayHelloFZv' 
collect2: ld returned 1 exit status 
--- errorlevel 1 
+4

「dmd mymodule.d main.d」 –

+0

試してみました。私はあなたに認識を与えることができるようにそれを適切な答えとして投稿してください。あなたはそれに値する!あなたがポイントを気にしなくても、少なくともそのように私は答えとしてマークすることができます。 – RedMage

+1

rdmd --build-only main.dを使用してください。 – Trass3r

答えて

9
  1. コンパイルするすべてのモジュールをコマンドラインで表示する必要があります。モジュールをリストしないと、モジュールはコンパイルされません。 であるモジュールは、コンパイラがその宣言を取り込むので、コンパイルされていないモジュールを使用することができますが、コンパイラはオブジェクトファイルを生成しません。リンカーがリンクすると、定義がないことが不平を言うでしょう。この場合、mymodule.sayHelloが定義されていないという事実に不満があります。

    最初のモジュールがインポートしたすべてのモジュールをコンパイラが自動的に検索してコンパイルするようにするには、rdmdを使用する必要があります。これはdmdのラッパーですdmd。 dmd自体はそれをしません。それはあなたがそれを伝えるモジュールだけをコンパイルするだけです。

  2. mymoduleにstd.stdioをインポートしていません。したがって、あなたがdmd main.d mymodule.dのようにしても(またはさらに良い場合は、dmd -w main.d mymodule.dまたはdmd -wi main.d mymodule.d)、writelnは宣言されていないため、mymoduleをコンパイルできません。 main.dがそれをインポートしたという事実は、mymoduleには何の影響も与えません。

  3. この場合は大したことではありませんが、実際にはモジュールの先頭にmodule modulename;という宣言を入れてください。コンパイラはファイル名からモジュール名を推測しますが、サブパッケージがあればにはが必要です。そうしないと、パッケージ名ではなくファイル名のみが推測されるため、インポートに問題が発生します。したがって、foo/bar/mod.dがあり、mod.dmodule宣言がない場合、modではなくfoo.bar.modと推測されます。

4

dmd mymodule.d main.d

自分で依存関係をうまくするのに十分なスマートされている私が知っている唯一の言語が移動し、Haskellのです。

+2

'rdmd'は依存関係を解消します。 'rdmd main.d'はファイルとすべての依存関係を構築し、結果を実行します。ビルドしたいのであれば、 '--build-only'をコマンドに追加してください。 – eco

+0

私はハスケルでその機能が大好きです。私はDもそれを持っていたほしい。 – Arlen

+2

賢明であるためには、私はGoまたはHaskellのいずれかがその機能を持っているとは思っていませんが、コンパイラはその機能を持っています。準拠したDコンパイラにも同様の機能があります。 – BCS

関連する問題