![](/img/trans.png)
[英]XCode 6.1 Missing required architecture X86_64 in file for extern library
[英]Xcode 6.1 Missing required architecture X86_64 in file
在 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
最近我將我的操作系統從 6.0 更新到了 Yosemite 和 Xcode 6.1。 我在 Stack Overflow 上搜索了這個問題,它指的是 Xcode 5.1 並嘗試了所有給定的解決方案,但沒有任何效果。
更新- 我按照答案中的建議嘗試了更改,但我仍然收到錯誤消息,顯示“缺少所需的架構 X86_64 ”。 在進一步調查中,我發現來自我的庫的文件 ClientAuthenticator.o 不是為 X86_64 架構構建的,可能這就是問題所在? 我正在尋找如何為 x86_64 構建它。
我的新問題是arm64 和 x86_64 之間有什么區別? 更多的似乎只是架構制造商之間的差異,但基本的 64 位架構保持不變。
您應該確保的第一件事是您的靜態庫具有所有架構。 當您在終端上執行lipo -info myStaticLibrary.a
時 - 您應該看到您的胖二進制文件的armv7 armv7s i386 x86_64 arm64
架構。
為了實現這一點,我假設您正在制作一個通用二進制文件 - 將以下內容添加到靜態庫項目的架構設置中 -
Standard architectures (including 64-bit) (armv7, armv7s, arm64)
。 $ARCHS_STANDARD
現在包括 64 位。 你也可以做$(ARCHS_STANDARD)
和armv7s
。 在沒有它的情況下檢查lipo -info
,您將找出缺少的架構。 這是所有架構的屏幕截圖 - 供您參考實現(使用靜態庫的項目)。 默認設置應該可以正常工作 -
更新 12/03/14 Xcode 6 標准架構不包括 armv7s。
那么, armv7s
嗎? 是的。 armv7 和 armv7s 指令集之間的一般差異似乎很小。 所以如果你選擇不包含 armv7s,目標 armv7 機器代碼在 32 位 A6 設備上仍然可以正常運行,幾乎沒有人會注意到性能差距。 來源
如果 Xcode 6.1+(iOS 8.1 及更高版本)有更智能的方法 - 請分享。
如果您正在構建一個通用庫並且需要支持模擬器 (x86_64),那么通過將Build Active Architecture Only
設置為No
來Build Active Architecture Only
適用於所有平台的框架。
許多人使用此處找到的構建腳本: http : //www.raywenderlich.com/41377/creating-a-static-library-in-ios-tutorial或此處: https : //gist.github.com/sponno/7228256用於他們在目標中的運行腳本。
我試圖將 x86_64、i386、armv7s、armv7 和 arm64 添加到架構部分,結果發現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}"
這是對您關於x86_64
和arm64
之間區別的最新問題的arm64
:
運行 64 位模擬器需要x86_64
架構。
運行 64 位設備(iPhone 5s、iPhone 6、iPhone 6 Plus、iPad Air、帶 Retina 顯示屏的 iPad mini)需要arm64
架構。
我遇到了完全相同的問題,並按照本教程https://github.com/jverkoey/iOS-Framework#faq
我完成這項工作的方式是在將腳本放入聚合的構建階段之后,在編譯之前,確保使用 iphone 模擬器(我使用 iPhone6)而不是 IOS 設備進行編譯。
這會給我 2 個切片:armv7 和 x86_64,然后將其拖放到新項目中對我來說工作正常。
我使用lipo
命令手動組合兩個構建的靜態庫。
例如:我有一個靜態庫(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
運行 build 並在Debug-iphonesimulator/
獲得產品
$ lipo -info Debug-iphonesimulator/libXYZ.a
Architectures in the fat file: Debug-iphonesimulator/libXYZ.a are: i386 x86_64
最后我組合成一個包含所有架構。
$ 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
我的解決方案是連接我的 iPhone 6,在它上面進行構建,我讓項目成功運行。
因為我是為 iPhone 6 Simulator 構建的。
另一件需要注意的事情是 XCode 處理庫導入很糟糕,在很多情況下,解決方案是在項目中找到導入的文件,在 Finder 中或從命令行中刪除它,然后重新添加,否則它XCode 不會正確更新。 通過 XCode 將舊文件留在那里,您一直在循環運行,不明白為什么它沒有編譯,缺少架構等。
如果您在使用外部庫之一的本機項目中遇到此問題。 您應該刪除該項目並再次使用react-native link <package-name>
。 那應該可以解決問題。
我嘗試使用上述所有方法,但在我的情況下沒有任何效果。
我使用了導致此問題的 SumUp 庫。
我通過以下方式修復它:
那仍然沒有解決問題,我仍然看到到處都是錯誤,因此來到這個線程,......但是,在玩弄設置之后,以下修復了它:
我希望這對使用 SumUP 集成的人有所幫助,花了一整天的時間才發現...
干杯,
H
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.