web-dev-qa-db-ja.com

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

この問題は私を夢中にさせています、そして、私はそれをどのように修正するかについてうまくいくことができません...

    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そしてそれは助けにはならない、誰かが何かアイデアを持っている?

295
Alex Trott

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

解決策は、[ビルドフェーズ]タブに移動してから[ソースのコンパイル]に移動し、必ずクラスをリストにドラッグしてください。

197
Cortex

私は同様の問題を抱えていたので、それぞれのプロジェクト設定(デバッグ、リリース、デプロイ)とターゲットのビルド設定で "Build Active Architecture Only"をチェックしなければなりませんでした。

37
Alex Zavatone

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

Objective-C++からC-Functionを呼び出す際のリンカエラー

20
user2166865

私もそれについて同様の問題を抱えていました。 _OBJC_CLASS _ $ _の後のクラス名は実際には私のクラスでした。その理由は、ソースコードファイルをナビゲーションリストにドラッグしたときに[Add to Target]をクリックしなかったためです。

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

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

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

14
syoleen

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

8
zaph

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

6
user1368045

私は同様の問題を抱えていたし、 "std ::"に関連するエラーを見ました

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

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

5
Andrew Soltan

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

4
James

この問題を解決したのは、次のとおりです。

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

私は私がいくつかのステップを実行することによって解決することができたという同様の問題を抱えていたので 私の答え をチェックしてください。

4

私は自分のプロジェクトにlibz.1.2.5.dylibを追加しただけで、それは魅力的に働きました。

ステップ -

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

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

3
Dhaval Sarvaiya

[ターゲット]> [ビルド設定]> [その他のリンカフラグ]の下に-ObjCフラグがあり、この問題が発生している場合は、削除することを検討してください。通常はロードされない静的ライブラリから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
3
ArtOfWarfare

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

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

だから: クラスを選択 - > ユーティリティ(ファイルインスペクタ) - > ターゲットメンバーシップ - > チェックマーク 欲しいターゲット。

3
andrei

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

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

3
Stan

私はPJSIPライブラリに関する問題に直面していました、

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

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

2
Adeesh Jain

私は私がadmobライブラリを使用するとき同じ問題を抱えていた、私は64ビットを含まずに "Architectures"を "Standard architectures armv7、armv7s"に変更してそれを修正した。 Build Settings

2
pabloverd

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

2
abbood

「C++標準ライブラリ」のターゲットビルド設定が「libc ++」に設定されているプロジェクトをコンパイルしようとすると、「Undefined symbols for architecture armv7:」というエラーが表示されました(C++ 11の機能を使用しているため必要)このプロジェクトには、同じ設定が 'libstdc ++'(または現在のコンパイラのデフォルト)に設定されているサブプロジェクトが含まれていました。

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

1
Si.

それが価値があるもののために、私がtarget-> Build Phases-> Link Binary With Librariesに行き、libstdc ++。tbd参照を削除し、そしてlibstdc ++。6.0.9.tbdへの参照を追加した後に私のものは修正された。

1
n8n8baby

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

1
Dela Torre

iphone5s でアプリを実行すると、この問題に遭遇しました。 arm64 to Architectures に解決しました。

1
alexqinbj

私はあなたが他の一般的な提案が助けにならないときあなたがチェックすることができるというあなたにもっと多くの提案をします。

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

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

私にとっての問題は、私の定数の値を .m に設定するためにi forget を使うことでした(実装)

file const kFooKey = @"Foo";
1
Jakub Truhlář

私は、モジュール(file .m)が作業中のターゲット内にない場合に、この問題に直面するために使用します。

ShareKitをインストールするとき、私はこの問題を抱えていました。それはシミュレータでは動作しましたが、デバイスでは動作しませんでした。 Other Linker Flag から-all_loadを削除しました。シミュレータとiPhoneデバイスの両方で問題なく動作します。

1
Jordan

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

XCode .mと.mm

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

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

1
Vito Andolini

最後に私はそれを考え出した、私はターゲットに不在のフレームワークを追加することによってこの問題を解決した - > Build Phases-> Link Binary to Libraries

1
lomec

ドラッグ&ドロップでファイルを追加しました。私がしたこと、私はすべてのファイルの参照を削除し(frameworksを除く)、それからそれらを再び正しく追加しました - プロジェクトにファイルを追加 オプション、問題はなくなりました。

1
Vaibhav Saran

私は同じ問題を抱えていました。私は膨大な数の回答からすべてのことを試しましたが、結局私の問題は次のとおりです。私はopenCVを使っているので、C++コードを自分のコードに組み合わせる必要があります。これを行うには、Objective-CおよびC++を使用するファイルを.mmに変更する必要があります。1つのファイルは変更しませんでした。このファイルはC++コードとは無関係ですが、変更する必要があります。

1
user2743760

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

その問題を修正してエラーを修正しました。

1
user2158690

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

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

0
Anthony Dito

mファイル(メソッドfuncを含む)の名前をmmに変更してください。逆の場合も同様です。私の名前をmmからmまたはmからmmに変更しました。

0
Kursat Turkay

派生クラスの少なくとも1つの非インライン関数を実装するようにしてください。これを行わないと、リンカはそのクラスの型情報を作成しないようにするかもしれません。

0
Michael Litvin

2つのクラスを別のクラスの.hファイルに書き込んだときにこの警告が表示されましたが、FORGOTはこのクラスの実装を.mファイルに書き込みます。

0
Nik Kov

Xcodeバージョン6.3.2では、ライブラリ libxml2.dylib および libz.dylib ライブラリにリンクバイナリを追加することで、まったく同じ問題を解決しました。

0
Stephen Chen

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

ターゲットの[Build Settings]の[Valid Architectures]エントリからarmv7sを削除したところ、この問題は解決しました。

0