アーキテクチャi386の未定義のシンボル:_OBJC_CLASS _ $ _ SKPSMTPMessage "、参照元:エラー


236

バックグラウンドでアプリケーションからメールを送信するためのフレームワーク、つまりSKPSMTPMessageフレームワークをインポートしました。以下のエラーが表示される理由を誰かが提案できますか

Undefined symbols for architecture i386:

"_OBJC_CLASS_$_SKPSMTPMessage", referenced from:
  objc-class-ref in ConfirmController.o

"_kSKPSMTPPartContentTransferEncodingKey", referenced from:
  -[ConfirmController sendEmail] in ConfirmController.o

"_kSKPSMTPPartMessageKey", referenced from:
  -[ConfirmController sendEmail] in ConfirmController.o

"_kSKPSMTPPartContentTypeKey", referenced from:
  -[ConfirmController sendEmail] in ConfirmController.o

ld: symbol(s) not found for architecture i386
collect2: ld returned 1 exit status

フレームワークの取得元:-

MFMailComposeViewControllerのフィールドのロック

更新

回答:フォルダをプロジェクトにドラッグアンドドロップして、[コピー]をクリックするだけです。つまり、プロジェクトチェックボックスとターゲットチェックボックスも選択します。


ビルドフェーズからSystemConfiguration.frameworkを追加した後、プロジェクトはうまくコンパイルされます
swiftBoy 2013

この問題を解決しました。バイナリとライブラリをリンクするためにrequireフレームワークを追加しました。
Mihir Oza

回答:


569

このタイプのエラーは、クラスの.mファイルがターゲットの[ビルドフェーズ]タブの[ソースのコンパイル]ステップにリストされていない場合に発生する可能性があります。通常、Xcodeがこれを行いますが、プロットが失われることがあり、.mファイルを手動で追加する必要があります。

これをする:

TargetSettings->ビルドフェーズ->ソースのコンパイル-> .mクラスを追加->ビルドして実行


49
一部のフレームワークが正しくリンクされていないために、これらのエラーが表示されることがあります。プロジェクトのビルドフェーズタブにある「リンクバイナリとライブラリ」ですべてのフレームワークを確認してください。
Heitara

これは.cファイルでも発生し、おそらく.mmでも発生する可能性があります。
ブロドニー、

ラジニーシュ、問題を修正しましたか?はいの場合、どのように修正しましたか?
codematrix 2013年

9
.mファイルを選択して、右側のパネルの「ターゲットメンバーシップ」セクションでターゲットの横にあるボックスにチェックマークを付けることができることに注意してください。プロジェクトにファイルを追加すると、「ターゲットに追加:」するかどうか尋ねられます。いいえと言ったかもしれませんが、私が言ったことを実行することでいつでも追加できます。
Nicolas S

4
:私は同じエラーを持っていた、私のためのソリューションがあるビルド設定 - > リンク - > その他のリンカフラグ - >追加-lLibraryName_$(PLATFORM_NAME)dのためのデバッグ、および追加-lLibraryName_$(PLATFORM_NAME)のためのリリース
ジョージ

37

私にとって、問題はフレームワークが欠落していることが判明しました。emを追加すると、うまくいきました。


これは、取得したエラーメッセージと実際には一致しなかったので、長い目で見たように見えましたが、SocketRocketサイトで提案されている依存フレームワークを追加すると、問題が修正されました。
2013

cocoapodsを介してフレームワークを追加したとしても、これは起こり得ます。フレームワークとして手動で追加する必要もありました。ありがとう!
FBente

追加したフレームワークでは、ビルドする前に他のフレームワークを追加する必要がありました。フレームワークを追加する場合は、必要なフレームワークが追加されていることを確認してください
Dave Patrick

29

有効なアーキテクチャとアクティブなアーキテクチャのみのビルドのプロパティを確認してください。

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


1
あなたはXcodeの4.2でこのオプションウィンドウを開く方法を教えてくださいすることができます
アナンド

これで問題が解決しない場合は、以下のAllen Pikeの回答を参照してください。
MattyG

この答えとアレンの答えの両方が私を助けました。私は本当に両方をチェックする必要がありました:ソースのコンパイルとアクティブアーキテクチャのみのビルドです。みんなありがとう!
ボグダン

@Anandそれらはターゲットのビルド設定にあります。
ライフロガー2013

18

cocoapodsを使用している場合は、ターゲットのビルド設定に他のリンカーフラグセクションに$(inherited)が含まれていることを確認してください

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


10

フレームワークはarmv(x)用にコンパイルされていますか?私にはi386用にコンパイルされているように見えますが、そのコードはiOSデバイスでは実行できません。または、armv(x)用にコンパイルされていて、シミュレータ(i386コード)で実行しようとしている。上に表示されているAkshayのビルド設定を使用して、フレームワークが、実行するチップ用に正しくコンパイルされていることを確認してください。


そのソート。フレームワークフォルダーをxCodeのプロジェクトフォルダーにドラッグアンドドロップする必要がありました。おかげで
マン

フレームワークをコンパイルして、iOSデバイスとシミュレーターの両方で同時に実行することは可能ですか?または、常に1つのオプションのみを選択する必要がありますか?
Aleksey Tsyss 2017年

同じプロジェクトに対して2つのウィンドウを開き、1つをシミュレーターで実行し、もう1つをデバイスで設定することについて話しているのですか?
オーウェンハートネット

7

xcodeで他のプロジェクトをインポートし、現在のプロジェクトとインポートプロジェクトの両方がコンパイラソースに同じファイルを持っている場合は、「ビルドフェーズ」設定で現在のプロジェクトの同じファイルを削除するだけです。


4

ええ、これはアレンが言ったことに関連しています...ソースファイルのユーティリティセクションでTargetMembershipを探してください。そのファイルをプロジェクトに関連付けるチェックボックスがあります。これを確認すると、この問題も解決されました。


他のすべての設定を変更しましたが、最終的にそれを修正したのはこれでした。ありがとう!
アレックトーマス

4

また、バイナリライブラリへのリンクが欠落している可能性もあります。Targesでビルドフェーズを確認し、必要なライブラリを追加してから、製品>製品のクリーンアップ>ビルド

それもうまくいくはずです!


4

同じプロジェクトを2回開いたときにこの問題が発生しました。元のプロジェクトは1つだけで、もう1つはgit urlから複製されました。

「製品」>「クリーン」で問題が解決しました。


4

私もこの問題に遭遇し、コンパイルソースとライブラリとのバイナリのリンクの両方に、必要なすべてのファイル/ライブラリ/フレームワークが含まれているかどうかを確認して修正しました。

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


4

これと同じ問題が発生したとき:

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

参照先:_OBJC_CLASS _ $ _ SKPSMTPMessage、ConfirmController.oのobjc-class-ref

フレームワークを追加するのを忘れたことがわかりました。正確にはQuartzCore.frameworkでした。


@JayprakashDubeyミッチにお願い
D_D

4

これを最後に試してください:

だから私はこのページのすべての提案を試してみました..どれもうまくいきませんでした..私の問題が始まった方法は、これの手順に従うことでした静的ライブラリをリンクする方法を教えるチュートリアル。私のサンプルプロジェクトでは、手順は問題なく機能しましたが、実際のプロジェクトでは、上記のエラーが発生し始めました。

だから私がしたことは、上記のチュートリアルの各ステップを実行し、各ステップの後にビルドしたことです。にビルドすることでした問題のある行は、この行であることが判明した

カテゴリを静的ライブラリにリンクするときに、このフラグがかつて推奨されていたことわかりましたが、その後、このフラグはXcode 4.2以降では不要であることがわかりました(-force_loadフラグも同様です。他の投稿で推奨されています。


3

同じ問題が発生したときに、「ライブラリのコンパイル済みバージョン(拡張子.a)」を追加するのを忘れていました。通常、ビルドフェーズのターゲット依存関係でインポートしたプロジェクトのライブラリを追加しますが、ビルドフェーズのライブラリとのリンクバイナリに「コンパイル済みライブラリ」を追加するのを忘れています。


3

他の人が同じ問題を抱えて、ここで終わる場合に備えて、私にとってうまくいったことを追加します。CLANG_ENABLE_MODULES設定がNoに設定されている古いプロジェクトがありました。何時間もの欲求不満の後、作業中のプロジェクトと比較したところ、LLVMビルド設定でEnable Modulesがnoに設定されていました。これを「はい」に設定すると問題が解決し、アプリは正常にビルドされます。

プロジェクト設定->ビルド設定->「モジュール」を検索し、有効化モジュール(CおよびObjective-C)をYESに更新します。


素晴らしい修正!これは私に大いに役立ちました!古いポッドプロジェクトがあり、新しいポッドを追加するたびにこのエラーが発生しました。ありがとう!!!
DiscDev

2

ビルド設定で「-all_load -lstdc ++」を他のリンカーフラグに追加しなかったため、エラーなしでsimを起動できましたが、起動時にMonkeyTalkログ出力を取得できませんでした。現在、再生ボタンは無効になっています。MT IDEの出力は、「Connection set to iOS Simulator」と表示されましたが、実行/再生ボタンを選択できませんでした。

元のプロジェクトのその他のリンカーフラグに「ObjC -all_load」があり、「-all_load -lstdc ++」を追加すると、この投稿に関するエラーメッセージが表示されました。「ObjC -all_load」を削除し、「-all_load -lstdc ++」のみを追加すると、プロジェクトがビルドされましたが、コンソールに確認として表示されたモンキートークログアウトがありません。


2

REALハードウェア用にのみコンパイルされたライブラリを使用している可能性があります。たとえば、Zephyr HxM SmartのようなBluetoothライブラリを使用している場合、それはおそらくシミュレータでコンパイルされず、実際のデバイスでの実行のみを目的としています。


1

IOS 6で同様の問題が発生しました。ビルドフェーズセクションの「Link Binary with Libraries」にstorekit.frameworkを追加することで解決できました。

今、それは魅力のように機能します。


1

PSTCollectionviewcontrollerを追加すると、7つのエラーで同じ問題が発生します。この問題の1つの解決策は、「xcode->ビルドフェーズ->コンパイルソース」を確認して、すべての「.m」ファイルを追加することです。投稿は将来ユーザーを助けるでしょう。


1

私の場合、拡張現実プロジェクトにCocoapodsを使用していましたが、cocoapodsを実装してプロジェクトの.workspaceを開くと、Xcodeプロジェクトターゲットと、同じファイル内に実装したそれらのポッドターゲットになってしまうことがわかりました。起こっていたのは、.mの一部が両方で使用されていたことです。ビルドフェーズ>>ソースのコンパイルでXcodeターゲットの重複したものを削除した後、問題なく動作しました。


1

新しいGoogleアナリティクスライブラリにアップグレードしようとしたときに、この非常に誤解を招くメッセージを発見しました。

私の場合、問題はライブラリの2つの競合するコピーがあることでした。それらは異なるフォルダーにありましたが、どちらも私のアプリのライブラリビルドパス(ビルド設定の下)にリストされていました。

廃止されたすべてのライブラリファイルをフォルダの外に移動すると、トリックが実行され、不可解なエラーメッセージが表示されなくなりました。




1

アクティブなアーキテクチャの変更がうまくいきました。私のライブラリの1つはi386を使用していました。

ではビルド設定の変更>> のみビルドアクティブ・アーキテクチャはい NOから

それは私のために働いた。それが他の人にも役立つことを願っています。

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


「いいえからはいへ」は理解しやすいです。何であれ、これはうまくいった。
Victor Laerte

0

答えは、プロジェクトの上にフォルダをドラッグアンドドロップし、[コピー]をクリックするだけです。


0

別のプロジェクトからソースファイルをドラッグアンドドロップすると、このメッセージが表示されました。それらを削除し、[ファイル]メニューの[ファイルの追加...]から追加すると、エラーなしでビルドされました。


0

NSManagedObjectで同様のエラーが発生しました。これは、Core Dataを使用していたが、ビルドフェーズでCore Dataフレームワークが欠落していたためです。


サムへようこそ。質問に答えるときは、別の回答にまだ存在しない新しい洞察、調査、またはコードを追加してみてください。別の回答が役に立ったことを単に共有したい場合は、重複した回答を投稿するのではなく、回答に賛成投票またはコメントしてください。
ブッチ

0

プロジェクトに含まれていないネイティブフレームワークを必要とするサードパーティライブラリをプロジェクトに追加すると、このタイプのエラーが発生する可能性があります。

新しく追加したライブラリの.hファイルと.mファイルを調べて、必要なフレームワークを確認してから、それらのフレームワークをプロジェクトに含めます([ターゲット]> [ビルドフェーズ]> [ライブラリとバイナリをリンク])。


0

フレームワークを削除し、プロジェクトをクリーンアップして、再度追加してコンパイルしてみてください。または、コンパイルソースでxcodeによって追加されたクラスを削除し、プロジェクトをクリーンアップして、再度追加してビルドします。


0

すでに削除したファイルを呼び出す任意のビューコントローラーにマクロを配置できることを覚えておいてください。

アプリは、アプリをビルドするまでエラーを表示しません。.oファイルのコンパイルフェーズでエラーがスローされます。

削除済みのファイルを呼び出しているMACROは必ず削除してください。

ありがとう:)


0

アランが行ったことに加えて、不足しているクラスを追加し、@ emdog4のソリューションに従い、Xcodeのビルドフェーズに移動し、「ライブラリとバイナリをリンク」の下で+をクリックして「CoreData.framework」を選択することにより、コアデータライブラリを追加しました。これは私のエラーを整理しました

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