1

Apple のSimpleFTPsampleをこの IOS プロジェクトから OSX プロジェクトに移植しようとしましたが、ビルドしようとすると次のエラーが発生します。

Undefined symbols for architecture x86_64:
"_OBJC_CLASS_$_NetworkManager", referenced from:
objc-class-ref in Document-DAE96E3625ECED63.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

私はオンラインで検索し、コピーしたすべてのコードを 2 回チェックしており、すべてのフレームワークが追加され、ヘッダーが含まれています。誰かが私が間違っていることを見つけるのを手伝ってくれませんか、またはこれが何を意味するのかをよりよく説明して、将来自分で解決できるようにしてください。NetworkManager クラスの何が問題なのかを調べるにはどうすればよいですか? コンパイルする前にエラーが発生しません。

ありがとう

---編集--- 例のコードの PUT 部分のみが必要であることを忘れていました。その部分のみを調べています。残りはすべてコピーされていません。NetworkManager.h、NetworkManager.m をコピーし、必要なコードの部分を PUT ファイルからコピーしました。

4

1 に答える 1

2

通常、リンカーが「何?そのクラスは聞いたことがない」ということは、そのクラスを実装するモジュール (SomeClass.m) がコンパイルされていないことを意味します。

これには、次の 2 つの方法があります。

コンパイルに失敗しました

これにより、SomeClass.o (あなたの場合は NetworkManager.o) を要求するエラーが発生します。それはあなたが得たエラーではありませんが、ここにリストする価値があると感じたほど似ています.

リンカーは、正常なコンパイルによって生成されるオブジェクト ファイルを必要とします。コンパイルに失敗すると、オブジェクト ファイルが存在しないため、「ファイルが見つかりません: blah/blah/blah/SomeClass.o」エラーが発生します。

コンパイルの失敗の 999‰ は、モジュールにエラー (構文エラー、認識されない名前 (スペル ミス/タイプミスなど)、またはコンパイルに失敗するその他の欠陥) が含まれていることが原因です。

ビルド エラーが原因で他のビルド エラーが発生することはよくあることなので、常にリストの一番上から順にエラーに取り組む必要があります。

これに対する解決策は、SomeClass.m に移動し、問題をすべて修正してから、ビルドを再試行することです。

あなたはそれをコンパイルしようとさえしませんでした

これはあなたが遭遇したものです。

すべてのターゲットにはビルド フェーズのリストがあり、それぞれがターゲットをビルドするために実行する必要があることを記述しています。ほとんどのターゲットには、少なくともソースのコンパイルとバイナリとライブラリのリンクのフェーズがあります。すべてのビルド フェーズには、入力ファイルのリストがあります。

ソースのコンパイル フェーズの入力ファイルは、Xcode がコンパイルしようとするモジュール ファイルです。[バイナリをライブラリとリンク] は、コンパイラが生成したすべてのもの (すべてのオブジェクト ファイル) と、そのリスト内のライブラリ (Cocoa.framework など) を暗黙的にリンクします。

ターゲットごとに、Xcode はそのターゲットの Compile Sources ビルド フェーズにあるモジュールのみをコンパイルしようとします。

モジュールをターゲットに追加するのを忘れても、同じターゲット内の別のモジュールで使用しようとする可能性は十分にあります。かなり前に別のターゲット用にモジュールを作成し、現在取り組んでいるターゲットでそのコードを使用したい場合や、モジュールを作成したときにボックスをチェックするのを忘れたり、モジュールを事業。

いずれにしても、使用しようとしているコンテンツのモジュールが、使用しようとしているターゲットでのコンパイル用にリストされていないことを示すエラー メッセージが表示されます。

これを修正するには、次の 2 つの方法があります。

  • 「不足している」モジュールを選択または移動し、ファイル インスペクター (⌘⌥1) を表示して、「ターゲット メンバーシップ」の下の適切なターゲットのボックスをオンにします。
  • プロジェクト ナビゲーターでプロジェクト オブジェクトを選択し、エディター内でターゲットを選択し、[ビルド フェーズ] タブに切り替えて、「見つからない」モジュールをプロジェクト ナビゲーターから [ソースのコンパイル] ビルド フェーズにドラッグします。

これを防ぐ方法は、モジュールをプロジェクトに追加するときに、関連するターゲットがチェックされていることを確認することです。これには、新しいモジュールの作成と、他の人から入手したモジュールの追加 (オープン ソースの再利用可能なクラスなど) の両方が含まれます。

于 2013-02-17T17:12:56.327 に答える