web-dev-qa-db-ja.com

XCode 6.1に必要なアーキテクチャX86_64がファイルにありません

XCode 6.1では、iPhone 6、iPhone 5s(iOS 7.1)でエラーが発生します

    Undefined symbols for architecture x86_64:
      "_OBJC_CLASS_$_ClientAuthenticator", referenced from:
      objc-class-ref in AppDelegate.o
ld: symbol(s) not found for architecture x86_64
linker command failed with exit code 1

これは私がアーキテクチャ設定の観点から持っているものです

  Architectures : Standard Architectures(armv7, arm64) - $(ARCHES_STANDARD)
  Base SDK : Latest iOS(8.1) 
  Valid Architectures: arm64, armv7, armv7s

  IOS Deployment Target: iOS 6.0

最近、OSをYosemiteとXCodeに6.0から6.1に更新しました。私は、XCode 5.1を参照するStackoverflowでこの質問を検索し、指定されたすべてのソリューションを試しましたが、何も機能しませんでした。

更新-回答に示されている変更を試みましたが、「Marching required architecture X86_64」というエラーが引き続き表示されます。さらなる調査で、ライブラリからのファイルClientAuthenticator.oがX86_64アーキテクチャ用にビルドされていないことがわかりました。おそらくそれが問題ですか?私はそれがx86_64用にどのように構築できるかを探しています。

私の新しい質問はarm64とx86_64の違いは何ですか?それ以上のことは、単にアーキテクチャのメーカー間の違いのように見えますが、基本的な64ビットアーキテクチャは同じままです。

44
yogsma
  • 最初に確認する必要があるのは、静的ライブラリにすべてのアーキテクチャがあることです。ターミナルでlipo -info myStaticLibrary.aを実行すると、ファットバイナリのarmv7 armv7s i386 x86_64 arm64アーキテクチャが表示されます。

  • それを達成するために、私はあなたがユニバーサルバイナリを作成していると仮定しています-静的ライブラリプロジェクトのアーキテクチャ設定に以下を追加します-

enter image description here

  • そのため、静的ライブラリプロジェクトのStandard architectures (including 64-bit) (armv7, armv7s, arm64)を手動で設定する必要があることがわかります。

enter image description here

  • または、通常の$ARCHS_STANDARDに64ビットが含まれるようになりました。 $(ARCHS_STANDARD)およびarmv7sも実行できます。 lipo -infoをチェックすると、欠落しているアーキテクチャがわかります。すべてのアーキテクチャのスクリーンショットを次に示します-

enter image description here

  • 参照実装用(静的ライブラリを使用するプロジェクト)。デフォルト設定は正常に動作するはずです-

    enter image description here

アップデート12/03/14Xcode 6標準アーキテクチャはarmv7sを除外します。

それで、armv7sは必要ありませんか?はい。 armv7命令セットとarmv7s命令セットの一般的な違いは小さいようです。したがって、armv7sを含めないことを選択した場合、ターゲットのarmv7マシンコードは32ビットA6デバイスで引き続き正常に実行され、パフォーマンスギャップに気付くことはほとんどありません。 ソース

Xcode 6.1+(iOS 8.1以降)のよりスマートな方法がある場合-共有してください。

51
raurora

ユニバーサルライブラリを構築していて、シミュレータ(x86_64)をサポートする必要がある場合は、Build Active Architecture OnlyNoに設定して、すべてのプラットフォームのフレームワークを構築します。 enter image description here

24
David Douglas

多くの場合、ここにあるビルドスクリプトを使用します: http://www.raywenderlich.com/41377/creating-a-static-library-in-ios-tutorial またはここ: https: //Gist.github.com/sponno/7228256 ターゲットの実行スクリプト用。

X86_64、i386、armv7s、armv7、およびarm64をArchitecturesセクションに追加して、ビルドが成功した後にlipo -info targetname.aが決してこれらのアーキテクチャを返さないようにするために、髪を引っ張っていました。

私の場合、ターゲットのランスクリプト、特にGistリンクのステップ1を変更して、-Archを使用してアーキテクチャを手動で含める必要がありました。

Step 1. Build Device and Simulator versions xcodebuild -target ${PROJECT_NAME} ONLY_ACTIVE_Arch=NO -configuration ${CONFIGURATION} -sdk iphoneos BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" xcodebuild -target ${PROJECT_NAME} -configuration ${CONFIGURATION} -sdk iphonesimulator -Arch x86_64 -Arch i386 -Arch armv7 -Arch armv7s -Arch arm64 BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}"

11
joelc

x86_64arm64の違いに関する最新の質問への回答を次に示します。

  • x86_64アーキテクチャは、64ビットシミュレーターを実行するために必要です。

  • arm64アーキテクチャは、64ビットデバイス(iPhone 5s、iPhone 6、iPhone 6 Plus、iPad Air、Retinaディスプレイ搭載iPad mini)を実行するために必要です。

9
boro

私はまったく同じ問題に遭遇し、このチュートリアルに従っていました https://github.com/jverkoey/iOS-Framework#faq

この作業を行った方法は、スクリプトをAggregateのビルドフェーズに入れた後、コンパイルする前に、IOSデバイスではなくiphoneシミュレーター(iPhone6を使用)を使用してコンパイルすることです。

armv7とx86_64の2つのスライスが表示され、それを新しいプロジェクトにドラッグアンドドロップするとうまくいきます。

4
user3919423

ビルドアクティブアーキテクチャのみを[いいえ]に設定すると、この問題は修正されました。 enter image description here

私の解決策は、iPhone 6を接続し、その上にビルドして、プロジェクトを正常に実行することでした。

IPhone 6シミュレーター用に構築していたからです。

1
JD - DC TECH

次の変更を行う必要があります(アーキテクチャをarmv7に変更し、その他を削除します)。

Change you have to make

0
shubham mishra

注意すべきもう1つの点は、XCodeがライブラリのインポートを適切に処理していないことです。多くの場合、解決策はプロジェクトでインポートしたファイルを見つけ、Finderで削除するか、コマンドラインから削除してから再度追加することです。 XCodeによって適切に更新されません。 XCodeに古いファイルを残しておくと、なぜコンパイルされないのか、アーキテクチャが見つからないなどの理由を理解せずに、サークル内で実行し続けます。

0
BPH

外部ライブラリのいずれかを使用する反応ネイティブプロジェクトでこの問題が発生している場合。プロジェクトを削除して、react-native link <package-name>を再度使用する必要があります。これで問題が解決するはずです。

0
Seraj Ahmad

lipoコマンドを使用して、2つのビルドされた静的ライブラリを手動で結合します。

例:ビルドする静的ライブラリ(libXYZ.a)があります。

Generic iOS Deviceのビルドを実行し、Debug-iphoneos/の製品を取得しました

$ lipo -info Debug-iphoneos/libXYZ.a
Architectures in the fat file: Debug-iphoneos/libXYZ.a are: armv7 arm64

次に、任意のiOS Simulatorに対してビルドを実行し、Debug-iphonesimulator/にあるProductを取得しました

$ lipo -info Debug-iphonesimulator/libXYZ.a
Architectures in the fat file: Debug-iphonesimulator/libXYZ.a are: i386 x86_64

最後に、1つに結合してすべてのアーキテクチャを含めます。

$ lipo -create Debug-iphoneos/libXYZ.a Debug-iphonesimulator/libXYZ.a -output libXYZ.a
$ lipo -info libXYZ.a
Architectures in the fat file: libXYZ.a are: armv7 i386 x86_64 arm64
0
allen huang