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ビットマシン用にそれをビルドしようとしました(ビルドは再び失敗します)。これは明らかにリンカのエラーですが、x86とx64の両方のアーキテクチャでIOBluetoothDeviceの実装を見つけることに問題があることを除いて、私は考えていません。 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;
}
正しい方向へのあらゆる助けまたはポインターをありがとう。
プロジェクトにIOBluetooth.frameworkが含まれていないようです。あなたはそれを追加することができます:
- 左ペイン(青いアイコン)の左上にあるプロジェクトをクリックします。
- 中央のペインで、[Build Phases]タブをクリックします。
「ライブラリとバイナリをリンクする」の下のプラスボタンをクリックします。
リストからIOBluetooth.frameworkを見つけてAddを押します。
これにより、IOBluetooth.framework定義がリンカによって確実に検出されます。フレームワークがターゲットのメンバーであることを確認するには、左ペインでフレームワークをクリックし、右ペインにそのフレームワークのターゲットメンバーシップを確認します(組織上の目的でフレームワークをFrameworksグループに移動しました)。
UPD
arm64アーキテクチャを使用するには、Appleではが必要です。プロジェクトでx32ライブラリを使用しないでください
それで、以下の答えはもう正しくありません!
古い答え
新しいXcode 5.1では、アーキテクチャarmv7、armv7s、およびarm64がデフォルトとして設定されています。
そして時々"ビルド失敗“アーキテクチャx86_64のための未定義のシンボル”"はこれによって引き起こされるかもしれません。なぜなら、(Appleのものではない)いくつかのライブラリはもともとx32用にコンパイルされていてx64をサポートしていないからです。
だからあなたが必要なのは、このようにあなたのプロジェクトターゲットのための「アーキテクチャ」を変更することです。
NB.あなたがCocoapodsを使用しているなら - あなたは "Pods"ターゲットに対しても同じことをするべきです。
アーキテクチャx86_64の未定義シンボル: "_OBJC_CLASS _ $ _ xxx"、yyy.oのobjc-class-refから参照
これは一般的に、クラス "yyy"から "xxx"(フレームワークまたはクラスかもしれません)を呼び出していることを意味します。コンパイラは "xxx"を見つけられないため、このエラーが発生します。
ナビゲータウィンドウでプロジェクトフォルダを右クリックして「にファイルを追加する」YourProjectNameをタップして、見つからないファイル(この場合は「xxx」)を追加する必要があります。 ""オプション。
ポップアップウィンドウがあなたのプロジェクトファイルをFinderに開きます。そこでは、足りないファイルを確認して、それらをプロジェクトに追加するだけです。 「必要に応じてアイテムをコピーする」ボックスをチェックするのを忘れないでください。がんばろう!!
派生データが破損したときにもXcode 7.2でこのエラーが発生しました(私の場合はビルドを中断し、それが根本的な原因であると考えています)。
そのため、他の解決法(特にChrisとBraveSがおそらくそうであると思われる)があなたの問題に合わない場合は、派生データを削除して(Select:Window/Projects/Derived Data - > Delete)再構築してください。
(他の人が参考のために追加しました - 私は最初の質問が正しく答えられたことを知っています)。
私の場合、それは図書館ではなく、いくつかのクラスでした。
アーキテクチャx86_64用の未定義シンボル:
"_ OBJC_CLASS _ $ _ ClassNmae"、SomeClassNameのobjc-class-refから参照されています。d:アーキテクチャx86_64のシンボルが見つかりません
clang:error:リンカコマンドが終了コード1で失敗しました(呼び出しを確認するには-vを使用してください)
解決策いくつかのスキーマ(Production、Devなど)を含むXcodeでいくつかのターゲットがありました。
「Xcode」 - >「ターゲット」 - >「ビルドフェーズ」 - >「ソースのコンパイル」
だから私はそれらを手動で追加しなければなりませんでした。
それから私はうまくコンパイル&ビルドできた。
Xcode 7.1にアップデートすると、この種のエラーが表示されることがありますが、上記のいずれの方法でも解決することはできません。私の場合の症状の1つは、アプリがシミュレータではなくデバイスで実行されることでした。あなたはおそらくあなたが使っているフレームワークのほとんどすべてに関連した膨大な数のエラーを見るでしょう。
修正は実際には非常に簡単です。 [ターゲット]> [ビルド設定]> [検索パス]セクションにある[フレームワーク検索パス]設定からエントリを削除するだけです([すべて]タブが選択されていることを確認してください)。
メインターゲットまたはテストターゲットのために($(inherited)以外に)別のエントリがある場合は、すべてのターゲットから誤ったパスを削除して再構築するだけです。
私はここですべてについてほとんど試みたが、私の問題は以前のcocoapodsビルドの残り物であることがわかった。私にとってうまくいったのは、
rm -Rf Pods; pod install
Objective-Cファイルを含むフォルダをプロジェクトにドラッグした場合にも、この問題が発生することがあります。そのフォルダが青く表示された場合は、正しくリンクされていないことを示していると思います。新しいファイルを追加するたびにpbxprojファイルがそれらの新しいファイルへのリンクで更新されるため、これを確認できます(バージョン管理を使用している場合)。ただし、pbxprojファイルが変更されていないフォルダを追加した後にリンクエラーが発生することがあります。そのため、オートコンプリートが機能し、インポートしたクラスが見つかりますが、実際にイメージを構築しようとすると、このエラーコードで失敗します。
解決策は、フォルダを追加するのではなく、ファイルを追加することです。これをすると、pbxprojファイルが更新され、このエラーが修正されるはずです。
これはまた、あなたが上で示唆されたことをして、そしてすべての正しいフレームワークを適切にリンクしたと仮定します。
ファイルを削除するのではなく、単にその参照を削除したため、同じエラーが発生しました。 Finderでファイルを見つけて削除するのに役立ちました。
私の場合は、Deployment targetを9.1に設定してカスタムフレームワークを作成しましたが、私のアプリのDeployment targetは低く、8.1をサポートしています。カスタムフレームワークを最小化するデプロイメントターゲットが私の問題を解決しました。
私はそれが昔からの質問であることを知っていますが、今日も同じエラーになり、上記の解決策はどれもうまくいきませんでした。
しかしオプションを設定することでそれを修正しました:
Project -> Architecture -> Build Active Architecture Only
はいへ
プロジェクトのコンパイルとビルドを正しく行う
Cファイルにリンクしようとしたときにこのエラーが発生する場合は、まず関数名のタイプミスをもう一度確認してください。次に、extern C {}
構文を使用せずにC++/Objective-C++環境からC関数を呼び出そうとしていないことを再確認します。 C関数を呼び出そうとしている.mmファイル内にあるクラスがあったので、私は私の髪を引き裂いていました。 C++ではシンボルが壊れているため、うまくいきません。 nmツールを使って生成された具体的なシンボルを実際に見ることができます。 .oファイルのパスを指定して、そのシンボルを呼び出しているファイルとそのシンボルを持っているファイルでnm -g
を実行します。それらが一致するかどうかを確認する必要があります。
nm -g file.o
これと絡み合ったC++シンボルを調べることができます。
nm -gC file.o
私はパーティーに遅刻しますが、これが起こり得るもう一つのシナリオを共有することを考えました。私はフレームワークに取り組んでいて、それをカカオポッドに配布していました。このフレームワークには、Objective CとSwiftのクラスとプロトコルの両方があり、正常に構築されていました。私がpodspecに.mファイルを含めるのを忘れたので、別のフレームワークまたはプロジェクトでpodを使用している間、それはこのエラーを与えていました。以下のように.swtift、.h、および.mファイルをpodspecソースに含めてください。s.source_files = "プロジェクト名/プロジェクト名/ **/*。{Swift、h、m}"
他の人の時間を節約できるといいのですが。
私はこの問題に何度も直面しました。これは通常、ビルドフォルダを削除したときに起こります。
簡単な解決策は、ポッドファイルを再度統合してインストールすることです。
pod deintegrate
pod install
私の場合は、ターゲットメンバーシップの選択を削除してからもう一度選択してください修正問題。
添付ファイルの写真でWilliam Cerniukの答えを確認してください。
私にとって、これはマージ競合の後に起こり始めました。
ビルドフォルダをきれいにして削除しようとしましたが、どれも役に立ちませんでした。この問題は関係なく起こり続けました。それから私は問題を抱えていてプロジェクトに再追加されたグループを削除することによって参照を再リンクした、そしてそれはうまくいった。
私の場合は追加しなければなりませんでした
target 'SomeTargetTests' do
inherit! :search_paths
end
(Xcode 10.1)
ビルド設定の他のリンカフラグに "-lc ++"を追加することで解決しました。
これは誰かに役立つかもしれません。それを最終的に把握するのに数日かかりました。私はOBJ-Cで働いています、そして私は行きました:
Project
- > Build Phases
- > Compile sources
と追加したばかりの新しいVC.m
ファイルを追加しました。
私はレガシーコードを使って作業していますが、私はOBJ-Cの初心者であり、.m
ファイルをソースライブラリにインポートすることすら考えていませんでした。
編集:
もう一度この問題に遭遇し、それは他の何かでした。この答えは5時間のデバッグの後に私を救った。このスレッドとより上のすべてのオプションを試してみました。 https://stackoverflow.com/a/13625967/7842175 これが役立つ場合は彼にクレジットをお願いしますが、基本的にはファイルを次のように設定する必要があります。ファイルインスペクタでのターゲット.
結局のところ、これは多くの理由で引き起こされる可能性がある非常に曖昧なエラーコードですので、さまざまなオプションを試して続けてください。
コンパイルしようとしている.cファイル内の#include <windows.h>
でも構いません。
いつか、私はRelease-universalからライブラリをコピーし忘れてRelease-iphoneosからコピーするのを忘れています。通常Release-iphoneosにはX86用に整理された.aファイルが含まれています。そしてそれはエラーを与えます。