2011-02-04 5 views
5

Objective-Cプログラムをコンパイルしようとしているときにリンカの問題が発生していますが、私が問題を理解できない理由が無知コンパイラのプロセスに関して。Objective-Cのコンパイル中に何が起こったか

誰かが編集中の手順の概要を教えてもらえますか?

私は現在のプロセスを理解し、これは次のとおりです。

  1. コンパイラのコピーがいずれかの内容は、それが中で定義されたファイルに.hファイルを含め、コンパイラがいるかどうかを追跡しません。 hファイルは既にインクルードされているため、プロジェクト内に複数回含まれる可能性があります。

  2. すべての.mファイルは、同等のCコード(オブジェクトコードにコンパイルされています)にコンパイルされます。

  3. リンカは、.hファイルの宣言とオブジェクトコード内の適切な関数との間にリンクを作成します。適切な関数は、同じ名前の.mファイルでそれらを探すことによって決定されます。

  4. オブジェクトファイルは、実行可能ファイルを形成するために一緒に接続され、メイン関数が実行可能ファイルのエントリポイントにあることを確認します。スペースを節約するために宣言はおそらく削除されるでしょうか?

これは(それができない場合がある)が正しいと仮定すると、これはおそらく、あなたはおそらく、リンカの問題が発生する複数のメソッド定義になってしまいますので、あなたが.Mファイルを#includeすることはありませんことを意味します。

誰でもこの照明に感謝します:)。

乾杯、

ダニー

答えて

3

あなたは、多かれ少なかれ正確にアイデアを得ます。いくつかの修正:

  1. #include

    は、それがすでに含まかいないかどうかをチェックしませんが、#importをチェックしません。

  2. .mは、最初にCに変換されてからオブジェクトコードに変換されません。それは20年前にそのように行われましたが、もはやそうではありません。オブジェクトコードに直接コンパイルされただけです。

  3. リンカーは、ファイルの名前付け方法には関知しません。 .h.mに異なるファイル名を使用できます。例えば、.hファイルで宣言された関数の実装を複数の.mファイルに分割することができます。

  4. 未使用の実装を削除するかどうかは、コンパイラとコンパイラのオプションによって異なります。

いずれの場合でも、結論は正しいです。実装ファイルを別の実装ファイルに含める/インポートしないでください。ダブルインプリメンテーションエラーが発生します。

+0

ああ、それは素晴らしいです。今はもっとはっきりしており、私はリンカーの問題を解決しました!どうもありがとう! :) – Danny

関連する問題