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


113

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**

どういう意味かわかりません。

回答:



92

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

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

必要なフレームワークを見つける方法については、Googleを使用するのが最も簡単だと思いますが、Xcodeのヘルプ検索を使用することもできます。記号の1つを検索し、符号化されていない名前(たとえば、SCNetworkReachabilityGetFlags)を解決するために最善を尽くします。そうすれば、多くの場合、developer.apple.comにある最初のドキュメントリンクが正しいものになります。通常、それほど遠くまで狩りをする必要はありません。この場合、それはこのページです:

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

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

それがうまくいくまでこれを続けてください...

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


64

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

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

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


1
これは、2つのプロジェクトファイルを不完全にマージしてターゲットメンバーシップが失われた場合によく発生します。
スティーブンヘプティング

1
どうもありがとう、xcodeは必要な.mファイルをビルドフェーズ段階に追加しませんでした!
ドリームパウダー

1
おかげで:) 2つのファイルをプロジェクトに追加し、これらの手順を実行した後にのみ、すべてが
正常でした

32

次の方法で解決しました(XCode 4の場合):

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

2)4番目のタブ作成フェーズを選択します

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

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

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

6)もう一度ビルドすると、エラーはなくなります。


ありがとうございました。私はMFMailComposeを検索してこの回答を見つけ、MessageUI.frameworkを追加して解決しました
Frank Yin

17

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

たとえば、common.mのメソッド定義にエラーが表示された場合ここに画像の説明を入力してください


このシンボルが見つかりませんというエラーが表示されましたが、状況ははるかに単純です。Schemeの1つに必要な1つの新しい関数を含む新しいモジュール(ファイル)を追加しました。数週間後、別のスキームを構築したとき、その関数の呼び出しは見つかりませんでした。それをターゲットに追加するだけで十分でした。
2016

17

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

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

私の問題は、結局のところ、私がそれを削除し、後で再びそれを追加した後、コンパイルクラスがなくなっていたことでした。

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


2
ありがとう...これは私にとってはうまくいきます。カスタムクラスを提供しました。両方のカスタムクラスをコピーしました。hと.mをプロジェクトに追加します。#importを実行しましたが、まだエラーが出ています。カスタムクラスの.mを「ソースのコンパイル」セクションに追加すると解決しました!
GeneCode

驚くばかり!Rocotilosと同じ問題が発生しました。カスタムクラスをインポートしてインポートしましたが、まだ問題がありました。これでうまくいきました!どうもありがとう!
Souleiman 2012

8

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

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


6

すべてのターゲットのビルド設定>アーキテクチャを変更して、プロジェクトの同様のエラーを修正しました。

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

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


5

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

単なるワイルドな推測です。


4

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


4

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


2

定義済みのテンプレート化されたクラスを使用するC ++プロジェクトで、同じエラーを受け取っているときに、プロジェクトナビゲーターで定義済みのテンプレート化されたクラスを含む.cppファイルを選択し、[削除]> [参照の削除]をクリックします。また、関連する.hファイルは、プロジェクトで参照されていますが、次のように.cppへの#includeステートメントが必要です。

#ifndef __CircularBuffer__CircularBufferT__
#define __CircularBuffer__CircularBufferT__

... snip ...

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

ご覧になりたい場合は、簡単なプロジェクトの例がgithubにあります。

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


2

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

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

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

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


2

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

私はこれを説明ページで気づきました:

ここに画像の説明を入力してください

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

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ファイルに依存している場合は、サンプルコードソースなどで再確認し、実際に適用されていることを確認してください。私の場合、正しく適用されていません。


0

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

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


0

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


0

データのみの@インターフェースを追加したことに気づき、空の@implementationブロックを追加するのを忘れただけで、これまでに困惑してきました。


0

Xcode 11でこの問題に遭遇し、修正により最小展開ターゲットが10.0から11.0に変更されました。

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