XCode 6.1文件中缺less必需的体系结构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
最近我更新了我的操作系统,优胜美地和XCode从6.0到6.1。 我已经在Stackoverflow上search了引用XCode 5.1的这个问题,并尝试了所有给定的解决scheme,但没有任何工作。
更新 – 我尝试了在答案build议的变化,但我仍然不断收到错误,说:“ 缺less所需的架构X86_64 ”。 在进一步的调查中,我发现来自我的库的文件ClientAuthenticator.o没有为X86_64体系结构构build,可能是这个问题? 我正在寻找如何为x86_64构build。
我的新问题是arm64和x86_64之间的区别是什么 ? 更多的似乎只是架构制造商之间的差异,但基本的64位架构保持不变。
-
你应该确定的第一件事是你的静态库有所有的体系结构。 当你在terminal上做一个
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
,你会发现缺less的架构。 以下是所有体系结构的屏幕截图 –
-
为您的参考实现(项目使用静态库)。 默认设置应该可以正常工作 –
更新12/03/14 Xcode 6标准体系结构不包括armv7s。
那么, armv7s
是不是需要? 是。 看来,armv7和armv7s指令集之间的一般差异很小。 所以如果你select不包含armv7s,目标armv7机器码在32位A6设备上依然运行良好,几乎没有人注意到性能差距。 资源
如果有更聪明的Xcode 6.1+(iOS 8.1及以上版本),请分享。
如果您正在构build通用库并需要支持模拟器(x86_64),则通过将“ Build Active Architecture Only
将Build Active Architecture Only
设置为“ No
Build Active Architecture Only
来为所有平台构build框架。
许多使用在这里find的构build脚本: http : //www.raywenderlich.com/41377/creating-a-static-library-in-ios-tutorial或在这里: https : //gist.github.com/sponno/7228256为他们的目标运行脚本。
我试图将x86_64,i386,armv7s,armv7和arm64添加到架构部分,只findlipo -info targetname.a
成功构build之后永远不会返回这些架构。
在我的情况下,我不得不修改目标脚本,特别是从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
我做这个工作的方式是在编译之前把脚本放到你的Aggregate的Build阶段之后,确保你使用iPhone模拟器(我使用iPhone6)而不是IOS设备编译它。
这将给我2片:armv7和x86_64,然后拖放到新项目工作正常。
改变之后,你必须做到这一点(改变架构到armv7和删除其他人): –