web-dev-qa-db-ja.com

アーキテクチャi386のシンボルが見つかりません

Xcodeでコンパイルしようとすると、次のエラーが表示されます。

  **Ld /Users/doronkatz/Library/Developer/Xcode/DerivedData/iKosher-bphnihrngmqtkqfgievrrumzmyce/Build/Products/Debug-iphonesimulator/iKosher.app/iKosher normal i386
    cd /Users/doronkatz/Sites/xCode/iKosher
    setenv MACOSX_DEPLOYMENT_TARGET 10.6
    setenv PATH "/Xcode4/Platforms/iPhoneSimulator.platform/Developer/usr/bin:/Xcode4/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin"
    /Xcode4/Platforms/iPhoneSimulator.platform/Developer/usr/bin/gcc-4.2 -Arch i386 -isysroot /Xcode4/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.2.sdk -L/Users/doronkatz/Library/Developer/Xcode/DerivedData/iKosher-bphnihrngmqtkqfgievrrumzmyce/Build/Products/Debug-iphonesimulator -L/Users/doronkatz/Sites/xCode/iKosher -F/Users/doronkatz/Library/Developer/Xcode/DerivedData/iKosher-bphnihrngmqtkqfgievrrumzmyce/Build/Products/Debug-iphonesimulator -filelist /Users/doronkatz/Library/Developer/Xcode/DerivedData/iKosher-bphnihrngmqtkqfgievrrumzmyce/Build/Intermediates/iKosher.build/Debug-iphonesimulator/iKosher.build/Objects-normal/i386/iKosher.LinkFileList -mmacosx-version-min=10.6 -all_load -ObjC -Xlinker -objc_abi_version -Xlinker 2 -lz -framework Security -framework CFNetwork -framework CoreData -framework Foundation -framework UIKit -framework CoreGraphics -framework QuartzCore -o /Users/doronkatz/Library/Developer/Xcode/DerivedData/iKosher-bphnihrngmqtkqfgievrrumzmyce/Build/Products/Debug-iphonesimulator/iKosher.app/iKosher

Undefined symbols for architecture i386:
  "_UTTypeCreatePreferredIdentifierForTag", referenced from:
      +[ASIHTTPRequest mimeTypeForFileAtPath:] in ASIHTTPRequest.o
  "_UTTypeCopyPreferredTagWithClass", referenced from:
      +[ASIHTTPRequest mimeTypeForFileAtPath:] in ASIHTTPRequest.o
  "_kUTTagClassMIMEType", referenced from:
      +[ASIHTTPRequest mimeTypeForFileAtPath:] in ASIHTTPRequest.o
  "_kUTTagClassFilenameExtension", referenced from:
      +[ASIHTTPRequest mimeTypeForFileAtPath:] in ASIHTTPRequest.o
  "_SCNetworkReachabilitySetCallback", referenced from:
      -[Reachability startNotifier] in Reachability.o
  "_SCNetworkReachabilityScheduleWithRunLoop", referenced from:
      -[Reachability startNotifier] in Reachability.o
  "_SCNetworkReachabilityUnscheduleFromRunLoop", referenced from:
      -[Reachability stopNotifier] in Reachability.o
  "_SCNetworkReachabilityCreateWithName", referenced from:
      +[Reachability reachabilityWithHostName:] in Reachability.o
  "_SCNetworkReachabilityCreateWithAddress", referenced from:
      +[Reachability reachabilityWithAddress:] in Reachability.o
  "_SCNetworkReachabilityGetFlags", referenced from:
      -[Reachability currentReachabilityStatus] in Reachability.o
      -[Reachability isReachable] in Reachability.o
      -[Reachability isConnectionRequired] in Reachability.o
      -[Reachability isConnectionOnDemand] in Reachability.o
      -[Reachability isInterventionRequired] in Reachability.o
      -[Reachability isReachableViaWWAN] in Reachability.o
      -[Reachability isReachableViaWiFi] in Reachability.o
      ...
ld: symbol(s) not found for architecture i386
collect2: ld returned 1 exit status**

意味がわかりません。

110
Doz

ASIHTTPRequestを使用しているため、プロジェクトをセットアップする必要があります。ここから2番目の部分を読む

https://allseeing-i.com/ASIHTTPRequest/Setup-instructions

49
epatel

この種のものが突然表示される場合、通常はプロジェクトに必要なフレームワークが不足していることを意味します。ライブラリと依存プロジェクトにはフレームワークが必要な場合があるため、最近フレームワークを追加した場合、このエラーが発生する可能性があります。

フレームワークを追加するには、プロジェクトビューでプロジェクト名を右クリックし、Addを選択してから、リストからExisting frameworks...を選択します。次に、欠落しているシンボルを持つフレームワークを見つけます。

必要なフレームワークをどのように見つけるかについては、Googleを使用するのが最も簡単であることがわかりましたが、おそらくXcodeヘルプ検索も使用できます。シンボルの1つを検索し、マングルされていない名前(SCNetworkReachabilityGetFlagsなど)を見つけるために最善を尽くします。その後、developer.Apple.comで最初に見つかるドキュメントリンクが適切な場合がよくあります。通常、それほど遠くまで狩る必要はありません。この場合、それはこのページです:

https://developer.Apple.com/documentation/systemconfiguration/scnetworkreachability-g7d

次に、ページの上部で、使用するフレームワーク、この場合はSystemConfigurationを示します。それをプロジェクトに追加して、再度コンパイルします。

それが機能するまでこれを続けてください...

編集:私はシミュレータを使用したことがありませんが、これはデバイス上で行うことです-私はそれが同じだと思います...

91

ターゲットから欠落しているソースファイルがある場合があります。

  1. どの記号が欠落しているかを調べる
  2. ターゲット->ビルドフェーズ->ソースのコンパイル
  3. リストされていない場合、不足しているソースファイルを追加します。
  4. 至福の場合はcommand + b

「欠落」していると思われるファイルを選択し、右側のユーティリティバーで、作成中のターゲットに対してチェックボックスが選択されていることを確認できます。

63
Nir Pengas

次の方法を使用して解決しました(XCode 4の場合):

1)プロジェクトナビゲーションウィンドウでプロジェクトを選択すると、右側にプロジェクトの概要が表示されます

2)4番目のタブビルドフェーズを選択する

3)[ライブラリとバイナリをリンク]オプションを選択します

4)取得するフレームワークを追加します

5)フレームワークをメインフォルダーからフレームワークフォルダーに移動します

6)再度ビルドすると、エラーがなくなります。

31
Pruthvid

問題は、追加されたフィールドのターゲットメンバーシップがアプリターゲットにないことです。そのため、ファイルを選択し、ターゲットメンバーシップのボックスにチェックマークを追加します。

たとえば、common.mのメソッド定義にエラーが表示された場合enter image description here

16
Lithu T.V

同じエラーに数時間を費やした後、これに対する私の解決策を追加することを考えました:(

上記の人たちは、最初に確認する必要があるのはフレームワークの追加を忘れたかどうかであるということでした。上記のPruthvidが提供する手順を参照してください。

私の問題は、それを削除した後に失われたコンパイルクラスであり、後で再び追加したことでした。

報告されたエラークラスについては、「ソースのコンパイル」を参照してください。作成した不足しているクラスを追加します。

16
justinkoh

不足しているフレームワークが実際に"ターゲット/ビルドフェーズ/ライブラリとバイナリをリンク"にリストされていることを確認してください。前述のように、通常はフレームワークが欠落していることを示しています。

私のプロジェクトには2つの同一のフレームワークがリストされていましたが、そのうちの1つを削除すると「Link Binary With Libraries」リストからも削除されたため、このエラーが発生しました。追加し直すと問題はなくなりました(そして、まだ2つのフレームワークがリストされています)

7
Tibidabo

ターゲットのALLBuild Settings> Architecturesを変更して、プロジェクトの同様のエラーを修正しました。

問題: Xcode 4.4からXcode 4.5にアップグレードしたとき、私のプロジェクトはシミュレーターで正常にコンパイルされましたが、デバイスではコンパイルされませんでした。デバイスでは、エラーを投げました"アーキテクチャarmv7sのシンボルが見つかりません"誤解を招く「Apple Mach-Oリンカエラー」および「clang:エラー:リンカコマンドが終了コード1で失敗しました」 (呼び出しを表示するには-vを使用します)。

原因(私の場合):プロジェクトには複数のターゲットがありましたが、メインターゲットのビルド設定>アーキテクチャにもかかわらずarmv7sアーキテクチャを含むように設定され、メインターゲットは別のターゲットに依存しており(ビルドフェーズ>依存関係にリストされています)、他のターゲットのビルド設定>アーキテクチャをリセットすることを考えていなかったため、含めるように変更する必要がありましたarmv7s。シミュレータとデバイスは異なるアーキテクチャで実行されていると思います。そのため、デバイスがそうでなくてもシミュレータは問題ありませんでした。

5
Josh

あなたのプロジェクトは別のプロジェクトに依存していますか?そのプロジェクト内のターゲットは、メインターゲットの直接の依存関係に設定されていますか?これが当てはまり、依存関係が設定されていない場合、依存ターゲットはすべての構成(つまり、シミュレーター)に対してビルドされていない可能性があります

ただの推測。

4
James J

私の場合、投稿されたソリューションはどれも機能しませんでした。 プロジェクトを削除し、SVNサーバーから新しいチェックアウトを行う必要がありました。幸運なことに、プロジェクトはバージョン管理システムでホストされていました。さもなければ私が何をするかわからない。

3
otaviokz

この問題を引き起こす可能性のある別の状況は、コードがC++を呼び出す場合、またはC++コードによって呼び出される場合です。 Obj-Cから呼び出されたときに、「symbol not found」として表示される自分の.cファイルのユーティリティ関数に問題がありました。修正は、ファイルタイプを変更することでした。Xcode4では、拡張情報ペインを使用してファイルタイプを「Objective-C++ Source」に設定しました。 Xcode 3では、「情報を見る」を使用してファイルタイプを「source.cpp.objcpp」に変更します。

3
invalidname

PSPDFKIT デモライブラリをプロジェクトにコピーしようとしたときに、これが起こりました。私はサイトのすべての指示とこのページのすべての提案に従いました。何らかの理由で上記のエラーを出し続けたのは、エラーメソッドでメッセージをgrepした場合、問題はバイナリにしか現れなかったということです明らかに私はソースコードb/cにアクセスできません。私はそれを支払う必要があります)。

ただし、手順ページでこれに気付きました:

enter image description here

だから私はその設定ファイルの内部に行き、これを見つけました:

OTHER_LDFLAGS=$(inherited) -ObjC -fobjc-arc -lz -framework CoreText -framework CoreMedia -framework MediaPlayer -framework AVFoundation -framework ImageIO -framework MediaPlayer -framework MessageUI -framework CoreGraphics -framework Foundation -framework QuartzCore -framework AVFoundation -framework CFNetwork -framework MobileCoreServices -framework SystemConfiguration -weak_framework UIKit

次に、上記のライブラリの作成者が提供するサンプルプロジェクトに行きました。以前のフラグがビルド設定の他のリンカフラグにそのままコピーされていたことに気付きました。しかし、私のプロジェクトではそうではありませんでした。それらを単にプロジェクトのビルド設定にコピーして貼り付け、他のリンカフラグとすべてが機能しました!

テイクアウェイポイント:セットアップでいくつかの.xcconfigファイルに依存している場合は、サンプルコードソースなどを再確認し、実際に適用されていることを確認してください。

1
abbood

定義されたtemplatizedクラスを使用するC++プロジェクトで、同じエラーを受け取りながら、定義されたtemplatizedクラスを持つ.cppファイルを選択しましたProject Navigatorで、[削除]> [参照の削除]をクリックします。また、関連する.hファイルは、プロジェクトでまだ参照されていますが、次のように.cppへの#includeステートメントが必要です。

#ifndef __CircularBuffer__CircularBufferT__
#define __CircularBuffer__CircularBufferT__

... snip ...

#include "CircularBufferT.cpp"
#endif /* defined(__CircularBuffer__CircularBufferT__) */

ご覧になりたい場合、単純なプロジェクトの例は github です:

これは少しの間接的なトリックであり、この回避策の元のソースを思い出せません。

1
vmanjz

このエラーが突然表示される場合、プロジェクトにいくつかのフレームワークが不足していることを意味します。ライブラリと依存プロジェクトにはフレームワークが必要な場合があるため、最近フレームワークを追加した場合、このエラーが発生する可能性があります。

フレームワークを追加するには、プロジェクトビューでプロジェクト名を右クリックし、[追加]を選択して、リストから[既存のフレームワーク]を選択します。次に、欠落しているシンボルを持つフレームワークを見つけます。

もう1つは、コンパイル済みリソースにクラスを追加し、そのクラスをプロジェクトから削除すると、エラーが表示されることです。最善の方法は、プロジェクトから削除したコンパイルリソース(ビルド設定->コンパイルソース)からクラスを削除することです。

私の場合、プロジェクトにadmobクラスを追加し、プロジェクトをコンパイルしました。後の場合、プロジェクトにアドモブを含めたくないので、プロジェクトからアドモブクラスの参照を削除しました。このエラーが発生したときに、コンパイルリソースからadmobの.mクラスを削除すると、この問題が解決しました。

Core.Location Frameworkを追加せずにCLGeocoderを使用していました。基本的に、このエラーは複数のことを意味します。これが他の人の助けになることを願っています。

0
logixologist

データのみの@interfaceを追加し、空の@implementationブロックを追加するのを忘れたことに気付く前に、これに困惑していました。

0
Steve Tranby

これが発生する可能性があるもう1つの理由は、SDKをアップグレードするときです。

グループを単に削除してから、新しいフォルダーをプロジェクトにドラッグアンドドロップすると、「ライブラリ検索パス」に両方のSDKが含まれます。解決するには、古いSDKパスを削除するだけです。

0
samwize