2

OK、私は現在Dで遊んでいるので(初めて)、おそらく私はいくつかの超基本的な質問をするでしょう...そしてここに私は... :-)

私がコンパイルすると-それとリンクするdmdとうまくコンパイルされます:

dmd myMain.d myTestModule.d

-v(verbose)フラグを設定すると、プロセスは基本的にコンパイルステップ(-cフラグ付き)とリンク(with gcc)であることに気付きました。

ただし、次の方法でコンパイルしようとすると、エラーが発生し続けます。

dmd -c MyMain.d myTestModule.d
gcc MyMain.o -o MyMain -m64 -lphobos2 -lpthread -lm

Undefined symbols for architecture x86_64:
  "_D8someFunc3strFmZAya", referenced from:
      __Dmain in MyMain.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status

どうしたの?何か案は?

4

2 に答える 2

6

コンパイルすると、外部シンボルを参照する可能性のあるオブジェクト ファイルが生成されます。リンクとは、関連するオブジェクト ファイルのグループを結合して単一のバイナリを生成するプロセスであり、それらの間のすべての外部参照などを処理します。

各ソース ファイルは、1 つの一致するオブジェクト ファイルにコンパイルされます。あなたの場合、myMain.d と myTestModule.d をコンパイルしたので、myMain.o と myTestModule.o の 2 つのオブジェクト ファイルが表示されます。ただし、(gcc を介して) リンカーにそれらの 1 つだけを提供すると、予想どおり、一部のシンボルが未解決になります。

gcc myMain.o myTestModule.o -o MyMain -m64 -lphobos2 -lpthread -lm

...トリックを行う必要があります。

また、リンカを呼び出すためにまったく同じ dmd バイナリを使用できることにも注意してください。それは、デフォルトのもの (phobos、pthread など) のリンクを処理します。

dmd myMain.o myTestModule.o -o MyMain -m64
于 2013-02-01T22:03:38.570 に答える
2

でリンクする必要もありますmyTestModule.o。ファイルごとにファイルdmd -cを生成します。そして、作成した 2 つのうちの 1 つだけをリンクしています。.o.d

于 2013-02-01T20:54:08.533 に答える