315

この問題は私を夢中にさせていて、それを修正する方法がわかりません...

    Undefined symbols for architecture armv7:
  "_deflateEnd", referenced from:
      -[ASIDataCompressor closeStream] in ASIDataCompressor.o
  "_OBJC_CLASS_$_ASIDataDecompressor", referenced from:
      objc-class-ref in ASIHTTPRequest.o
  "_deflate", referenced from:
      -[ASIDataCompressor compressBytes:length:error:shouldFinish:] in ASIDataCompressor.o
  "_deflateInit2_", referenced from:
      -[ASIDataCompressor setupStream] in ASIDataCompressor.o
ld: symbol(s) not found for architecture armv7
collect2: ld returned 1 exit status
Command /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc-4.2 failed with exit code 1

私はそれが関係していると思います:

ld: symbol(s) not found for architecture armv7

しかし、私は付け加えました:libz.1.2.3.dylibそれは助けにはなりません。

4

40 に答える 40

512

一般的な原因

「アーキテクチャ armv7 の未定義シンボル」の一般的な原因は次のとおりです。

  1. ヘッダーをインポートし、正しいライブラリにリンクしていません。デフォルトではプロジェクトに含まれていないため、特に QuartzCore などのライブラリのヘッダーでは一般的です。解決する:

    • Link Binary With Librariesのセクションに正しいライブラリを追加しますBuild Phases

    • デフォルトの検索パスの外にライブラリを追加したい場合は、ビルド設定の値Library Search Pathsにパスを含め、
      -l{library_name_without_lib_and_suffix}.-lzOther Linker FlagsBuild Settings

  2. ファイルをプロジェクトにコピーしましたが、ファイルを に追加するターゲットを確認するのを忘れました。解決する:

    • Build Phases正しいターゲットの を開き、Compile Sources不足しているファイルを展開して追加し.mます。これがあなたの問題である場合は、以下のCortexの回答にも賛成してください。

  3. ホスト マシン上のシミュレータである i386 などの別のアーキテクチャ用に構築された静的ライブラリを含めます。解決する:

    • ライブラリ ベンダーからプロジェクトに含めるライブラリ ファイルが複数ある場合は、シミュレータ用 (i386) とデバイス用 (たとえば armv7) を含める必要があります。

    • 必要に応じて、両方のアーキテクチャを含むファット スタティック ライブラリを作成できます。



元の回答:

正しい libz ファイルにリンクしていません。ファイルを右クリックしてファインダーで明らかにすると、そのパスは iOS sdk フォルダーのどこかにあるはずです。これが私の例です

/開発者/プラットフォーム/iPhoneOS.platform/開発者/SDKs/iPhoneOS4.3.sdk/usr/lib

参照を削除してから、ターゲットのリンク バイナリとライブラリ セクションのビルド フェーズに再度追加することをお勧めします。

于 2011-06-21T17:38:30.990 に答える
198

私は昨夜同様の問題を抱えていました。この問題は、Finder から Xcode のプロジェクトにクラスをドラッグしたという事実に関連していました。

解決策は、[Build Phases] タブに移動してから [Compile Sources] に移動し、クラスをリストにドラッグすることを確認することでした。

于 2012-04-16T07:39:49.053 に答える
37

同様の問題が発生し、各プロジェクト構成(デバッグ、リリース、および展開)とターゲットのビルド設定で[アクティブなアーキテクチャのみをビルドする]をチェックする必要がありました。

于 2011-12-19T23:52:54.787 に答える
21

「未定義のシンボル」リンカ エラーの別の考えられる原因は、.mm ファイルから C 関数を呼び出そうとしていることです。この場合、ヘッダー ファイルをインポートするときに extern "C" {...} を使用する必要があります。

Objective-C++ から C 関数を呼び出しているリンカー エラー

于 2013-03-13T18:33:59.337 に答える
14

私はそれと同様の問題を抱えていました。_OBJC_CLASS_$_ の後のクラス名は、実際には私のクラスでした。その理由は、ソース コード ファイルをナビゲーション リストにドラッグするときに、[ターゲットに追加] にチェックを入れていなかったからです。

私の解決策は次のとおりです。

  1. ナビゲーション リストからクラスを削除し、[参照のみを削除] を選択します。

  2. ソース コード ファイルをもう一度ドラッグし、[ターゲットに追加] のチェック ボックスがオンになっていることを確認します。チェックボックスは、「必要に応じてコピー」と「グループの作成」のすぐ下にあります。

于 2012-05-09T00:32:28.917 に答える
8

通常、現在のバージョンにリンクされているバージョン識別子のないエイリアスがあります。この場合、libz.dylib は libz.1.2.5.dylib にリンクされています。バージョン管理されたエイリアスの代わりにベース エイリアスを使用します。

于 2011-09-25T12:16:12.893 に答える
6

admob ライブラリを使用すると同じ問題が発生したため、64 ビットを含めずに「アーキテクチャ」を「標準アーキテクチャ armv7、armv7s」に変更して修正しました。ビルド設定

于 2013-11-29T10:09:56.057 に答える
5

Target -> Build Settings -> Apple LLVM compiler language: 「C++ Language Dialect」と「C++ Standard Library」を Compiler default に設定すると解決しました。

于 2012-11-06T22:22:00.407 に答える
5

プロジェクトに libz.1.2.5.dylib を追加しただけで、魅力的に機能しました。

手順-

  1. ビルド フェーズに移動します。
  2. バイナリをライブラリにリンク - 「+」ボタンを使用して、追加するフレームワークとライブラリを選択します。
  3. リストから libz.1.2.5.dylib を選択します。
  4. ビルドして実行します。
于 2013-08-22T09:03:53.457 に答える
5

同様の問題があり、「std::」に関連するエラーが発生しました

Build Settings -> Apple LVM 5.0 - Language C++ -> C++ Standard Library を変更しました

libc++ (C++11 をサポートする LLVM C++ 標準ライブラリ) から libstdc++ (GNU C++ 標準ライブラリ) へ

于 2013-11-15T20:14:59.603 に答える
4

.h ファイルに複数の @interfaces があり、対応するすべての @implementation ディレクティブをまだ含めていません。それらがすべてバランスが取れていることを確認してください。

于 2013-04-17T22:27:52.860 に答える
4

これが私がこの問題をどのように得たかです:

プロジェクト ナビゲーターにドラッグして、別のプロジェクトから .h、.m、および NIB を追加しました。Xcode はそれらをビルド フェーズに適切に追加しませんでした。

いくつかの手順を実行することで解決できた同様の問題があったため、私の回答を確認してください。

于 2012-05-02T14:42:31.567 に答える
3

おそらく、いくつかのクラスがターゲットから欠落しています。これは通常、新しいクラス ファイルの名前を変更/削除/プロジェクトに追加したときに発生します。修正するには、新しく追加されたクラスをいくつかのターゲットに追加します。

Project Navigator (右側のサイドバー) でクラスを選択し、Utilities サイドバー (右側のサイドバー) を開き、Utilities から File Inspector (ファイルのようなアイコン) を選択し、Target Membership タブでターゲットにチェックマークを付けます。これはすべて、「参照の削除」を回避し、「ターゲットに追加」トリックをオンにして再度追加するためです。

クラス->ユーティリティ (ファイル インスペクター) - >ターゲット メンバーシップ->必要なターゲットを選択します。

于 2012-11-29T12:35:08.033 に答える
3

iOS5 のアップグレードを扱っている場合、ターゲット 4.3 に記述されたプロジェクトをコンパイルするには、Project Navigator で libz.1.2.3.dynlib の名前を libz.1.2.5.dynlib に変更するだけでコンパイルできることがわかりました。

私の iPhoneOS50SDK/usr/lib フォルダーには libz.1.2.3.dynlib がありません。これがベータ版なのか、自然なアップグレードなのかわかりません。

于 2011-09-18T19:16:11.150 に答える
3

プロジェクトに移動し、[ビルド フェーズ]、[ソースをコンパイル]、[GameCenterManager.m をリストに追加] をクリックします。

于 2012-10-13T19:01:44.533 に答える
3

これで問題が解決しました。使用している依存関係はarmv7をサポートしていません。ということで、削除するしかありませんでした。とにかく、Armv7は非常に古いiPhone(iPhone 4など)にのみ使用されます。

  • 「ビルド設定/すべて」に移動します
  • 「有効なアーキテクチャ」を「arm64 arm64e」に設定します
于 2020-05-25T14:43:04.323 に答える
2

ここでこの提案が見つからなかったので、ここに行きます: プロジェクトに複数のターゲット (つまり、OSX 用と iOS 用) がある場合は、各ターゲットに関連するライブラリをリンクする必要があります。たとえば、私の場合はAudioToolbox が必要でした。OSX 用に 1 回、iOS 用に 1 回追加する必要がありました ( frameworksフォルダーの下に、ターゲットごとに各ライブラリの複製が必要です。1 つしか表示されない場合は、赤旗です)。

于 2012-11-04T07:55:23.947 に答える
1

私にとっての問題は、 .m (実装)で定数の値を設定するのを忘れていたことです。

file const kFooKey = @"Foo";
于 2015-03-02T13:46:12.960 に答える
1

価値があるのは、ターゲット->ビルドフェーズ->ライブラリとバイナリをリンクし、libstdc++.tbd参照を削除してから、libstdc++.6.0.9.tbdへの参照を追加した後、私のものは修正されました。

于 2016-10-15T07:03:50.570 に答える
1

私も同じ問題を抱えていました。私は答えの巨大なリストからすべてを試しましたが、最終的に私の問題は次のとおりでした:私はopenCVで作業しているので、コードにC++コードを組み合わせる必要があります。これを行うには、objective-c と C++ を使用するファイルを .mm に変更する必要があります。私は 1 つのファイルを変更しませんでした。このファイルは C++ コードに接続されていませんが、変更する必要がありました。

于 2014-01-24T00:09:04.867 に答える
1

モジュール(ファイル.m)が作業中のターゲットにない場合、私はその問題に直面していました。

于 2015-02-11T07:51:25.607 に答える
1

最後に、私はそれを理解しました。ターゲットに存在しないフレームワークを追加することでこの問題を解決しました->ビルドフェーズ->ライブラリとバイナリをリンク

于 2013-02-21T14:23:13.003 に答える
1

私の場合、Objective C++ を使用する必要があるフレームワークを追加しました。この投稿を見つけました:

XCode .m と .mm

これは、Objective-C++ クラスもコンパイルできるように、main.m の名前を main.mm に変更する必要があることを説明しています。

それは私のためにそれを修正しました。

于 2014-11-11T19:16:14.710 に答える
1

shareKit をインストールするときに、この問題が発生しました。シミュレーターでは機能しましたが、デバイスでは機能しませんでした。-all_load をOther Linker Flagから削除したところ、シミュレーターと iPhone デバイスの両方ですべて正常に動作しました。

于 2014-02-08T15:44:10.820 に答える
0

サードパーティのフレームワークを 1 つ含めたとき、同じ問題に直面していました。

ターゲットのビルド設定の有効なアーキテクチャ エントリから armv7s を削除すると、問題が解決し、動作し始めます。

于 2013-05-21T12:48:20.037 に答える
0

派生クラスの非インライン関数を少なくとも 1 つ実装してみてください。これを行わないと、リンカーはそのクラスの型情報を作成しない可能性があります。

于 2014-10-05T14:50:33.820 に答える
0

私の場合、ソース管理下に新しいブランチを作成したときに、同様の問題が発生しました。

私は単に行くだけでこの問題を解決することができましたProduct>Clean

于 2015-10-31T05:45:50.453 に答える
0

TARGETS -> General -> Deployment Info -> set Target 8.1 または 10.0 に移動します

フレームワークまたはライブラリには、ARMV7 アーキテクチャがありません。

于 2020-01-29T07:12:56.787 に答える