アーキテクチャarmv7の未定義のシンボル


307

この問題は私を夢中にさせており、それを修正する方法を見つけることができません...

    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そしてそれは役に立たない、誰かが何かアイデアを持っていますか?


既存の回答のいずれにも含まれていない別の可能性は、-ObjC他のリンカーフラグを使用している可能性があるため、(Parseからなど)表示すべきではない使用している外部静的ライブラリからのObj-Cが表示されることです。これが当てはまる場合は私の回答を参照してください:stackoverflow.com/a/26151208/901641
ArtOfWarfare

2
経験則として、somethimes XCodeは、ファイルがプロジェクトに追加されなかった場合、Match-Oやアーキテクチャーi386(またはその他)で見つからないシンボルなどの種類のエラーを提供します。プロジェクトフォルダーを右クリックして、「<プロジェクト>にファイルを追加」を実行できます。
Fabricio PH

nmツールを使用して生成された具体的なシンボルを実際に見ることができます。.oファイルのパスへのターミナルを入力しnm -g、シンボルを呼び出しているファイルとシンボルを含むファイルで実行します。それらが一致するかどうかを確認する必要があります。これにより、エラーの手掛かりが得られます。nm -g file.oこれでデマングルされたC ++シンボルを検査できます。nm -gC file.o
james_alvarez

ここの誰かが私を助けてくれますか?以下のエラーが発生しますが、上記の解決策はどれも機能しません。私はすでにすべての可能な設定で何日も過ごしました。Undefined symbols for architecture armv7: "YGConfig::YGConfig(int (*)(YGConfig*, YGNode*, YGLogLevel, char const*, void*))", referenced from: _YGConfigNew in libyoga.a(Yoga.o) ld: symbol(s) not found for architecture armv7 clang: error: linker command failed with exit code 1 (use -v to see invocation)
レッドデビル

回答:


506

一般的な原因

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

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

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

    • デフォルトの検索パスの外にライブラリを追加するLibrary Search Paths場合は、ビルド設定の値にパスを含め、
      -l{library_name_without_lib_and_suffix}(たとえばlibz.aの場合は-lz)のOther Linker Flagsセクションにパスを追加できBuild Settingsます。

  2. あなたは、あなたのプロジェクトにファイルをコピーするだけにファイルを追加するターゲットをチェックするのを忘れました。解決する:

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

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

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

    • オプションで、両方のアーキテクチャを含むファットスタティックライブラリを作成できます。



元の答え:

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

/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk/usr/lib

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


4
また、プロジェクトの設定/その他のリンカーフラグに「-licucore」という単語を追加する必要がある場合もあります。デバッグビルド用に自動的に追加されましたが、リリースビルドでは追加されなかったため、コンパイルされませんでした。
JulianB

4
同じ問題がありました。実際にインストールノートを正しく読んでいなかったため、bugsenseの新しいバージョンにはビルドフェーズでlibzバイナリを追加する必要があることに気付きませんでした。
Max MacLeod

2
ヘッダーファイルで宣言したすべてのクラスについて、それぞれの.mファイルに@implementationセクションを含めましたか?
slcott、2013年

7
付け加えたいのは、この質問への別の回答を参照して、それが役に立った場合は賛成票を投じるように言ってくれたことを本当に尊敬していたと思います。
Andrew

手伝ってくれてありがとう!:)私にとっては、その他のリンカーフラグセクションでの入力を明示的に支援しました-framework <FrameWorkName>。XCTestに問題があったため、を追加する必要がありました-framework XCTest。ありがとう!:)
piotr_ch 2014年

198

昨夜も同様の問題がありましたが、その問題は、FinderからXcodeのプロジェクトにクラスをドラッグしたことに関連しています。

解決策は、[ビルドフェーズ]タブ、[ソースのコンパイル]の順に移動し、クラスをリストにドラッグすることです。


6
これが私が以前に探していた答えであることに気付いていればよかったのですが、クラスをコピーするときに「ターゲットに追加」をチェックすることを確認できます。
T.マークル2012

1
おっと...とても簡単に修正できました。明確にするために、ファインダーからプロジェクトにドラッグしてクラスを追加した場合、XCodeが必ずしもそれらをビルドフェーズリストに追加するとは限りません。ビルドフェーズの[ソースのコンパイル]で[+]ボタンを押すだけで、問題のファイルがすべて追加され、すぐにコンパイルされました。
Amos

1
ワオ。アップルは本当にエラーメッセージを再検討する必要があります。
devios1 2013年

2
これを修正する別の方法は、欠落していると言われる選択ファイルです。[ユーティリティ]スライドアウトバーを開きます。(それは一番右のものです)そして、「ファイルインスペクタ」を選択してください。次に、[Target Membership]の下のプロジェクトにチェックがあることを確認します。Xcode 4.6.2を使用しています
zingle-dingle 2013年

1
不足しているファイルがわからないので、アシスタントエディター(2番目の編集ビュー)にビルドフェーズを表示しました。問題のファイルを左側の編集ビューで開き、インポートした各ファイルがビルドフェーズに存在することを確認しました。私はそうしなかったものを追加し、それは解決されました。
Dan Sandland 2013

38

同様の問題があり、各プロジェクト構成(デバッグ、リリース、デプロイメント)とターゲットのビルド設定で「アクティブアーキテクチャのみをビルド」をチェックする必要がありました。


3
私にとってもトリックをしました。メインプロジェクトでも必要だっただけです。
Kirualex

4
同じ問題が発生します。Build Active Architecture Only設定は、間で異なるPodsと私のプロジェクト。リンク段階で失敗しました。
AechoLiu 2016年


14

私にも同じような問題がありました。_OBJC_CLASS _ $ _の後のクラス名は、実際には私のクラスでした。その理由は、ソースコードファイルをナビゲーションリストにドラッグするときに[ターゲットに追加]を選択しなかったためです。

私の解決策は:

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

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


追加するだけです:これはエラーの最も一般的な原因ではありませんが、私はあなたの答え(ボックスをチェックしなかった)だけが今私に起こります。
アダム

8

通常、現在のバージョンにリンクされているバージョン識別子のないエイリアスがあります。この場合、libz.dylibはlibz.1.2.5.dylibにリンクされています。バージョン付きのエイリアスではなく、基本エイリアスを使用します。


5

[ターゲット]-> [ビルド設定]-> [Apple LLVMコンパイラ言語]で、[C ++言語ダイアレクト]と[C ++標準ライブラリ]をコンパイラのデフォルトに設定すると、問題の解決に役立ちました。


5

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

手順 -

  1. ビルドフェーズに進みます。
  2. ライブラリとバイナリをリンク-「+」ボタンを使用して、追加するフレームワークとライブラリを選択します。
  3. リストからlibz.1.2.5.dylibを選択します。
  4. ビルドして実行します。

5

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

ビルド設定を変更しました-> Apple LVM 5.0-言語C ++-> C ++標準ライブラリ

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


5

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


4

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


4

あなたが旗を持っている場合は-ObjC、あなたのターゲット>ビルドの設定>その他のリンカのフラグの下で、あなたがこの問題を取得している、それを削除することを検討。通常はロードされない静的ライブラリ(Obj-CカテゴリであるIE)からObj-Cコードをロードする必要があるために意図的に追加した場合は、の-force_load <path>代わりにを使用する必要があります-ObjC

<path>Xcodeプロジェクトディレクトリを基準にしてください。IE、ディレクトリ構造が次のようになっている場合:

iOSProject
  + iOSAPI.framework
      + iOSAPI
  + iOSAPI.xcodeproj

次に、このフラグを設定する必要がありますOther Linker Flags

-force_load iOSAPI.framework/iOSAPI

そのような複数のライブラリを含める場合は、ライブラリ-force_loadごとに個別の行を含める必要があります。

-force_load iOSAPI.framework/iOSAPI
-force_load another.framework/another

4

これが私がこの問題をどうやって得たかです:

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

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


3

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

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



3

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

プロジェクトナビゲーター(右側のサイドバー)でクラスを選択し、ユーティリティサイドバー(右側のサイドバー)を開き、[ユーティリティ]から[ファイルインスペクター](ファイルのようなアイコン)を選択し、[ターゲットメンバーシップ]タブの下でターゲットにチェックマークを付けます。これは、「参照の削除」を回避し、「ターゲットに追加」トリックを選択して再度追加するためです。

だから、:選択クラス - > ユーティリティ(ファイルインスペクタ) - > ターゲット会員 - > ティックしたいターゲット。


2

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


この答えは私を助けました。しかし、私の状況はさらに簡単でした...コードベースが参照するフレームワークを追加するのを忘れていました。私の場合、AVFoundation.frameworkの読み込みに失敗しました。
John Erck

ええ、「バイナリとライブラリをリンクする」フェーズでフレームワークを追加するのを忘れていました。
最大

2

PJSIPライブラリの問題に直面していました。

プロジェクトの他のリンカーフラグで以下を試して、エラーを解決できるようにしました:-framework Foundation -framework UIKit

上記のリンカフラグはgithub上のSiphoneプロジェクトで使用されます。これらの設定は、C ++ライブラリのリンクに関連する問題の解決に役立ちます。


PJSIPライブラリで同じ問題が発生しています。解決策を詳しく説明できますか
Rajat Jain

プロジェクトビルド設定の他のリンカーフラグに次の値を設定します。-framework Foundation -framework UIKit
Adeesh Jain

エラーメッセージ:ファイル/Users/user/Downloads/pjproject-2.7.2/pjsip-apps/src/pjsua/ios/libyuv.aを無視します。ファイルは、リンクされているアーキテクチャではないアーカイブ用にビルドされました(i386):/ Users /user/Downloads/pjproject-2.7.2/pjsip-apps/src/pjsua/ios/libyuv.aアーキテクチャi386の未定義のシンボル:「_pjsip_register_method」、以下から参照:
Rajat Jain

シミュレータでアプリを実行しようとしているようですが、libyuv.aはシミュレータアーキテクチャi386用にビルドされていません。デバイスで直接アプリを実行してみてください
Adeesh Jain

PjsipをSwiftに統合したい。ブリッジヘッダーを作成してみましたが、うまくいきませんでした。少し教えていただけますか?
Rajat Jain

1

最後に私はそれを理解しました、私はこの問題をtarget-> Build Phases-> Link Binary with Librariesにフレームワークを追加することで解決しました


1

私はかつてこの問題を抱えていました。クラスを移動しているときに、.mmファイルを.hに、宛先フォルダーのファイルでました。

その問題を修正するとエラーが修正されました。


1

「C ++標準ライブラリ」のターゲットビルド設定が「libc ++」に設定されているプロジェクトをコンパイルしようとすると「アーキテクチャーarmv7の未定義シンボル:」エラーを受け取りました(プロジェクトがC ++ 11の一部の機能を使用していたために必要)。プロジェクトには、同じ設定が「libstdc ++」(または現在のコンパイラーのデフォルト)に設定されているサブプロジェクトが含まれていました。

サブプロジェクトの「C ++標準ライブラリ」設定をlibc ++に変更すると修正されましたが、最初にサブプロジェクトのデプロイメントターゲットを5.0以上に設定した後にのみ(libc ++には5.0が必要です)。


1

他の一般的な提案が役に立たないときに確認できるより多くの提案をします。

他のプロジェクト(libxxx.a)とリンクすると、nmなどのツールでシンボルを見つけることができる奇妙な問題が発生することがありますが、ldでシンボルを見つけることができません。次に、2つのプロジェクトが同じフラグでビルドされているかどうかを確認する必要があります。それらの一部はバイナリ形式に影響を与える可能性があります。

  1. C ++コンパイラを確認してください。
  2. C ++方言の設定を確認してください。
  3. C ++ランタイム型のサポートを確認してください。(-frtti / -fnortti)
  4. 同じ名前の.aが他の場所にあるかどうかを確認してください。リンクパスリストの目的のファイルを超えている可能性があります。それらを削除します。

1

iphone5でアプリを実行するとこの問題が発生しました。アーキテクチャarm64を追加することで解決しました


1

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


1

shareKitのインストール時にこの問題が発生しました。シミュレータでは機能しましたが、デバイスでは機能しませんでした。その他のリンカーフラグから-all_loadを削除し、シミュレーターとiPhoneデバイスの両方ですべてが正常に動作します。


1

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

XCode .mと.mm

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

これで解決しました。




1

また、ドラッグアンドドロップでファイルを追加しました。私がしたことは、すべてのファイル(を除くframeworks)の参照を削除してから、[ プロジェクトにファイルを追加 ]オプションを使用してそれらを適切に追加し、問題が解決したことです。


1

Unity3D 5からビルドしていて、Prime31プラグインも使用していて、このエラーが発生する場合は、おそらく.dllの重複が原因です。Unityのエディターで警告を確認すると、警告が表示され、ビルドエラーが発生する可能性があることを警告します。これが当てはまるかどうかを確認するには、プロジェクトの検索フィールドにP31と入力すると、ポップアップが表示されます。複製には、ファイル名の最後に「1」があります。これはおそらく、ストアまたはPrime31メニュータブを介してエディターでプラグインを更新したことが原因です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.