Xcodeビルドエラー「アーキテクチャx86_64の未定義のシンボル」


168

Xcode初心者の質問:

Xcode 4.6.3を使ったのはこれが初めてです。

ペアになっているBTデバイスを検索してNSLogに出力する、非常にシンプルなコンソールプログラムを作成しようとしています。

次のエラーでビルドされます。

Undefined symbols for architecture x86_64:
  "_OBJC_CLASS_$_IOBluetoothDevice", referenced from:
      objc-class-ref in main.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

私は狂ったように検索しました。一般的な問題は、ヘッダーファイルのみがインポートされ、リンカによって実装(* .m-file)が見つからないファイルへの参照である必要があります。ただし、IOBluetoothライブラリはFoundation Frameworkのような標準フレームワークです。

上記のステートメントで何が欠けていますか?

また、32ビットマシン用にビルドを試みました(ビルドは再び失敗します)。これは明らかにリンカーエラーですが、ヘッダーファイルは標準で含まれているフレームワークから呼び出され、 IOBluetooth?

参考までに、私のメインコード "main.m"は次のとおりです。

#import <Foundation/Foundation.h>
#import <IOBluetooth/objc/IOBluetoothDevice.h>          // Note the import for bluetooth
#import <IOBluetooth/objc/IOBluetoothDeviceInquiry.h>   // Note the import for bluetooth


int main(int argc, const char * argv[])
{
    @autoreleasepool {
        IOBluetoothDevice *currentDevice;
        NSArray *devices = [ IOBluetoothDevice pairedDevices];


        for (id currentDevice in devices){
          NSLog(@"%i : %@",[ currentDevice classOfDevice ], [ currentDevice name ]);    
        }
    }
    return 0;
}

ヘルプまたは正しい方向へのポインタをありがとう。


17
他のリンカーフラグに追加$(inherited)して、クリーンでビルドしてみてください。
Resty

1
これに遭遇したとき、mファイルのファイルインスペクターに移動し、ターゲットメンバーシップの下のボックスをチェックして、それを使用しようとしたモジュールにエクスポート(?)する必要があることに気付きました。
Landon Kuhn

回答:


123

プロジェクトにIOBluetooth.frameworkが含まれていないようです。次の方法で追加できます。

-左ペインの左上にあるプロジェクト(青いアイコン)をクリックします。

-中央のペインで、[ビルドフェーズ]タブをクリックします。

-「バイナリをライブラリにリンク」の下で、プラスボタンをクリックします。

-リストからIOBluetooth.frameworkを見つけ、[追加]をクリックします。

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

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

これにより、IOBluetooth.framework定義がリンカーによって確実に検出されます。左側のペインでフレームワークをクリックし、右側のペインでフレームワークのターゲットメンバーシップを確認することで、フレームワークがターゲットのメンバーであることを確認できます(整理のためにフレームワークグループの下にフレームワークを移動したことに注意してください)。

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


3
出来た!スクリーンショットを撮る努力をしてくれてありがとう!
RisingSun 2013

同じことがoAuthIOSフレームワークでもうまく機能します。構築しようとしているルートプロジェクトに、podsフォルダーからoAuthIOSフレームワークを追加します
prodeveloper 2014年

1
私はIOBluetooth.frameworkを検索していますが、見つかりません:S
Menno van der Krift

それは奇妙なことです。
Chris Livdahl、2015年

驚くばかり!数時間助かった!
Bravo Kevin

49

UPD

Apple arm64アーキテクチャを使用する必要があります。プロジェクトでx32ライブラリを使用しないでください

したがって、以下の答えは正しくありません!


古い答え

新しいXcode 5.1では、デフォルトでアーキテクチャarmv7、armv7s、およびarm64が設定されています。

また、「ビルドエラー「アーキテクチャx86_64の未定義のシンボル」」というエラーが発生する場合もあります。なぜなら、いくつかのライブラリ(アップルのものではない)は、もともとx32用にコンパイルされており、x64をサポートしていません。

したがって、必要なのは、このようにプロジェクトターゲットの「アーキテクチャ」を変更することです

NB。Cocoapodsを使用している場合-「ポッド」ターゲットについても同じことを行う必要があります。

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


3
基本的に、Valid Architecturesプロパティからarm64を削除しました。次に、上記に示されているように、私が推測する有効なアーキテクチャに何があるかを調べることだけが強制されます!
Randika Vishman 14

@Vishman、こんにちは!との違いをカバーする適切なSOの答えValid ArchitecturesありArchitecturesます。
アレクセイポタポフ2014

iOS 7.1シミュレーターでプロジェクトを実行しようとしたときに、Xcode 5でリンクされたエラーを修正し
ました。iOS6.x

@BraveS:arm64アーキテクチャを削除すると、64ビットデバイスで機能しますか?
Jayprakash Dubey 2015

1
@JayprakashDubeyこんにちは、64ビットのサポートがない組み込みのアプリストアをアップロードして、私のアプリを拒否しました。arm64を追加しようとすると、「ビルドx86_64の未定義のシンボル」というエラービルドエラーが発生します。アーキテクチャからarm64を削除した場合。そして、私はarm64を有効なアーキテクチャに入れました。私のアプリは承認されていますか???
SP Balu Kommuri 2015

31

アーキテクチャx86_64の未定義のシンボル: "_OBJC_CLASS _ $ _ xxx"、参照元:yyy.oのobjc-class-ref

これは通常、クラス「yyy」から「xxx」(フレームワークまたはクラスの可能性があります)を呼び出していることを意味します。コンパイラは「xxx」を見つけることができないため、このエラーが発生します。

ナビゲーターウィンドウでプロジェクトフォルダーを右クリックして、不足しているファイル(この場合は "xxx")を追加し、[ ファイルを " YourProjectName "に追加 ]オプションをタップする必要があります。

ポップアップウィンドウがFinderでプロジェクトファイルを開きます。そこで、不足しているファイルを確認して、プロジェクトに追加するだけです。「必要に応じてアイテムをコピーする」ボックスをチェックすることを忘れないでください。幸運を!!


17

Xcode 7.2でも、派生データが破損したときにこのエラーが発生しました(私の場合、ビルドを中断し、それが根本的な原因であると疑っています)。

したがって、他のソリューション(特に、ChrisとBraveSの可能性が高いと思われる)が問題に適合しない場合は、派生データを削除して(選択:ウィンドウ/プロジェクト/派生データ->削除)、再構築してみてください。

(他の人が参照できるように追加しました-元の質問が正しく回答されたことを知っています)。


14

Xcode 9.0b5では、Xcode 9.0b5にバグがあり、ソースコードを追加してもターゲット設定が反映されないため、これが発生する可能性があります。後から各ファイルのターゲットを手動で設定する必要があります。

Xcodeプロジェクトと手動ターゲットメンバーシップの図


13

私の場合、それはライブラリではなく、いくつかのクラスでした。

アーキテクチャx86_64の未定義のシンボル:
"_OBJC_CLASS _ $ _ ClassNmae"、参照元:objc-class-ref in SomeClassName "。。

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

clang:エラー:リンカーコマンドが終了コード1で失敗しました(-vを使用して呼び出しを確認してください)

解決策 Xcodeにいくつかのスキーマ(Production、Devなど)を持ついくつかのターゲットがありました。新しく追加した実装(Class.m)の一部が

Xcode-> Targets-> Build Phases-> Compile Sources

そのため、手動で追加する必要がありました。

その後、コンパイルとビルドに成功しました。


これで私の問題は解決しました。動的フレームワークを使用していました。もう1つは、手動で追加するアイデアが好きではないということです。
toxicsun 2016

9

私も同じ問題に遭遇しました、上記の方法は機能しません。次のディレクトリにあるファイルを誤って削除してしまいました。 ここに画像の説明を入力してください

または

〜/ライブラリ/ Developer / Xcode / DerivedData /

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


4
実際のパス/コマンドが何であるか疑問に思う方へ:~/Library/Developer/Xcode/DerivedData/ CLI経由で、次のようにディレクトリを整理できます:rm -rf ~/Library/Developer/Xcode/DerivedData/
Bramus

6

Xcode 7.1に更新すると、このタイプのエラーが表示される場合があり、上記のいずれの方法でも解決できません。私の場合の症状の1つは、アプリがシミュレータではなくデバイス上で実行されることでした。おそらく、使用しているほとんどすべてのフレームワークに関連する多数のエラーが表示されます。

修正は実際には非常に簡単です。TARGETS> Build Settings> Search Pathsセクションにある "Framework Search Paths"設定からエントリを削除するだけです( "All"タブが選択されていることを確認してください)。

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

ここに($(inherited)以外に)メインターゲットまたはテストターゲットの別のエントリが表示された場合は、すべてのターゲットから障害のあるパスを削除して再構築します。


5

これは、Objective-Cファイルを含むフォルダーをプロジェクトにドラッグした場合にも発生することがあります。そのフォルダーが青く表示される場合は、適切にリンクされていないことを示していると思います。これを確認できます(バージョン管理を使用している場合)。新しいファイルを追加するたびに、pbxprojファイルがそれらの新しいファイルへのリンクで更新されるためです。ただし、フォルダーを追加した後、pbxprojファイルが変更されなかった(したがって、リンクエラーが発生した)ことがあります。したがって、オートコンプリートが機能し、インポートしたクラスが見つかりますが、実際にイメージをビルドしようとすると、このエラーコードで失敗します。

解決策は、フォルダを追加するのではなく、ファイルを追加することです。これを実行すると、pbxprojファイルの更新が表示され、このエラーが修正されます。

これはまた、上で提案したことを実行し、適切なすべてのフレームワークを適切にリンクしていることを前提としています。


5

私はここでほぼすべてを試しましたが、私の問題は以前のココアポッドのビルドの残骸であることが判明しました。私のために働いたのは:

  1. rm -Rf Pods; pod install
  2. 派生データの削除(ウィンドウ/プロジェクト...ターゲットを選択します。[削除]ボタンをクリックします)
  3. 再構築

4

同じエラーが発生しました。ファイルを削除する代わりに、ファイルへの参照を削除しただけだからです。Finderでファイルを見つけて削除すると役立ちました。


3

私はそれが古い質問であることを知っていますが、今日は同じエラーが発生し、上記の解決策のどれも機能しませんでした。

ただし、オプションを設定して修正しました。

Project -> Architecture -> Build Active Architecture Only

はいへ

プロジェクトは適切にコンパイルおよびビルドされます


3

私はこの問題に何度も直面しています。これは通常、ビルドフォルダーを削除したときに発生します。

簡単な解決策は、podファイルを再度統合してインストールすることです。

pod deintegrate
pod install

2

Cファイルにリンクしようとしたときにこのエラーが発生した場合は、まずタイプミスがないか関数名を再確認してください。次に、extern C {}構造を使用せずにC ++ / Objective-C ++環境からC関数を呼び出そうとしていないことを再確認します。C関数を呼び出そうとする.mmファイルにあるクラスがあったので、髪を切り裂いていた。C ++ではシンボルが壊れているため、機能しません。nmツールを使用して生成された具体的なシンボルを実際に見ることができます。.oファイルのパスへのターミナル、および実行nm -g、シンボルを呼び出しているファイルとシンボルを含むファイルでします。これらが一致するかどうかを確認してください。これにより、エラーの手がかりが得られます。

nm -g file.o

これで解読されたC ++シンボルを検査できます。

nm -gC file.o

2

私の場合、Deploymentターゲットを9.1に設定してカスタムフレームワークをビルドしましたが、アプリのDeploymentターゲットは低く、8.1をサポートしています。カスタムフレームワークの展開ターゲットを最小限に抑えることで問題が解決しました。


2

私はパーティーに遅れましたが、これが発生する可能性があるもう1つのシナリオを共有することを考えました。私はフレームワークに取り組んでいて、ココアポッドを介してそれを配布していました。フレームワークには、目的のcと迅速なクラスとプロトコルの両方があり、正常に構築されていました。別のフレームワークまたはプロジェクトでポッドを使用しているときに、.mファイルをポッドスペックに含めるのを忘れたため、このエラーが発生していました。以下のように、podspecソースに.swtift、.hおよび.mファイルを含めてください:s.source_files = "Projectname / Projectname / ** / *。{swift、h、m}"

他の人の時間を節約できることを願っています。



1

私にとって、これはマージの競合の後に起こり始めました。

ビルドフォルダーを削除して削除しようとしましたが、どれも役に立ちませんでした。この問題は関係なく発生し続けました。次に、問題のあるグループを削除して参照を再リンクし、プロジェクトに再度追加しました。



1

私の場合、追加する必要がありました

    target 'SomeTargetTests' do
        inherit! :search_paths
    end
私のpodfileに移動し、/ Podsディレクトリを削除して「pod install」を実行します

(Xcode 10.1)


1

これは誰かを助けるかもしれません。最終的にそれを理解するのに数日かかりました。私はOBJ-Cで働いており、次の場所に行きました。

Project-> Build Phases-> Compile sources追加しVC.mたばかりの新しいファイルを追加しました。

私はレガシーコードを使用していて、OBJ-Cの初心者なので、.mファイルをソースライブラリにインポートすることすら考えていませんでした。

編集:

この問題に2回遭遇しましたが、それは別の問題でした。この答えは、5時間のデバッグ後に私を救いました。このスレッドなどのすべてのオプションを試しました。https://stackoverflow.com/a/13625967/7842175これが役立つ場合は、クレジットを提供してください。ただし、基本的に、ファイルインスペクターでファイルをターゲットに設定する必要がある場合があります。

これはファイルインスペクタです。必要なすべてのターゲットが「チェックされている」ことを確認してください

全体として、これは非常に漠然としたエラーコードであり、さまざまな理由で発生する可能性があるため、さまざまなオプションを試してください。


1

ときどき、Release-universalからライブラリをコピーするのを忘れて、誤ってRelease-iphoneosからコピーします。通常、Release-iphoneosには、X86用にプルーニングされた.aファイルが含まれています。そしてそれはエラーを与えます。


1

私の場合、ターゲットメンバーシップの選択削除してから、もう一度選択して問題を修正します。

添付写真でウィリアム・サーヌークの回答を確認してください。


0

私の場合、問題はコンパイルされたフレームワークアーキテクチャでした。Xcode 11
実行していて、Swift 5.1を使用しています

  • 私は次のような3つのターゲットを持っていました:
    • MyApp
    • MyAppTests
    • MyAppFrameWork

テストを実行しようとしましたが、MyAppFrameWork製品は汎用iOSデバイス用にコンパイルされており、テストターゲットにはarm x86-64が必要だったため、iOSシミュレータ用のフレームワークを再構築し、テストケースを正常に実行し始めました。

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