8

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

これが私のmain.dファイルの内容です:

import std.stdio;
import mymodule;

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

そして、これが私のモジュールファイルの内容(mymodule.d)です:

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

}

コンパイルするには、bashを介して実行します。

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

2 に答える 2

11
  1. コマンドラインでコンパイルしているすべてのモジュールをリストする必要があります。モジュールをリストしないと、コンパイルされません。コンパイルされたモジュールは、コンパイルされていないモジュールを使用できます。これは、コンパイラがそれらの宣言をプルするためですが、コンパイラはそれらのオブジェクト ファイルを生成しません。そのため、リンカがリンクに移動すると、定義が欠落していると不平を言います。mymodule.sayHelloこの場合、定義されていないという事実について文句を言います。

    最初のモジュールがインポートするすべてのモジュールをコンパイラーに自動的に検索させ、それらをすべてコンパイルさせたい場合は、dmd に付属する dmd のラッパーである rdmd を使用する必要があります。dmd 自体はそれを行いません。指示したモジュールのみをコンパイルします。

  2. std.stdiomymodule にインポートしていません。そのため、本来dmd main.d mymodule.dあるべき (またはそれdmd -w main.d mymodule.d以上) のようにしたとしても、宣言されていないdmd -wi main.d mymodule.dため、mymodule のコンパイルに失敗します。writelnmain.d がそれをインポートしたという事実は、mymodule には影響しません。

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

于 2012-06-20T17:34:30.693 に答える
5

dmd mymodule.d main.d

私が知っている唯一の言語で、依存関係を独自に解決できるほどスマートな言語は、Go と Haskell です。

于 2012-06-20T17:47:18.393 に答える