在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
最近我将我的操作系统更新为Yosemite和XCode,从6.0升级到6.1。我在Stackoverflow上搜索了这个涉及XCode 5.1的问题并尝试了所有给定的解决方案,但没有任何效果。
更新 - 我按照答案中的建议尝试了更改,但我仍然收到错误消息“缺少必需的体系结构X86_64 ”。在进一步调查中,我发现来自我的库的文件ClientAuthenticator.o没有为X86_64架构构建,可能这是问题所在?我正在寻找它如何为x86_64构建。
我的新问题是 arm64和x86_64之间有什么区别?更多的看起来只是架构制造商之间的区别,但基本的64位架构仍然是相同的。
答案 0 :(得分:51)
首先要确保静态库具有所有体系结构。当您在终端上执行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设备上正常运行,几乎没有人会注意到性能差距。 Source
如果有更智能的Xcode 6.1+(iOS 8.1及更高版本) - 请分享。
答案 1 :(得分:24)
如果您正在构建通用库并需要支持模拟器(x86_64),则可以通过将Build Active Architecture Only
设置为No
来为所有平台构建框架。
答案 2 :(得分:11)
许多人使用此处找到的构建脚本: 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}"
答案 3 :(得分:9)
以下是对您关于x86_64
和arm64
之间差异的最新问题的回复:
x86_64
架构。
arm64
架构(iPhone
5s,iPhone 6,iPhone 6 Plus,iPad Air,iPad mini和Retina
显示器)。
答案 4 :(得分:4)
我遇到了完全相同的问题并且正在学习本教程 https://github.com/jverkoey/iOS-Framework#faq
我做这项工作的方法是在编译之前将脚本放入Aggregate的Build阶段之后,确保使用iphone模拟器(我使用的是iPhone6)而不是IOS Device进行编译。
这将给我2个切片:armv7和x86_64,然后将其拖放到新项目中对我来说工作正常。
答案 5 :(得分:1)
我的解决方案是连接我的iPhone 6,在它上面构建,我让项目成功运行。
因为我正在为iPhone 6 Simulator构建。
答案 6 :(得分:1)
答案 7 :(得分:0)
答案 8 :(得分:0)
要注意的另一件事是XCode正在严格处理库导入,在许多情况下,解决方案是在项目中查找导入的文件,在Finder中删除它或从命令行删除它并再次添加回来否则它不会被XCode正确更新。通过XCode留下旧文件,你继续在圈子里运行,不理解为什么它没有编译,缺少架构等。
答案 9 :(得分:0)
我使用lipo
命令手动组合两个构建的静态库。
EX:我有一个静态库(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/
$ 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
答案 10 :(得分:0)
如果使用外部库之一在本机项目中遇到此问题。您应该删除该项目,然后再次使用react-native link <package-name>
。那应该可以解决问题。
答案 11 :(得分:0)
我尝试使用上述所有方法,但在我的情况下没有任何效果。
我使用了导致此问题的 SumUp 库。
我通过以下方式修复它:
那仍然没有解决问题,我仍然看到到处都是错误,因此来到了这个线程,......但是,在尝试了以下设置后,它修复了它:
我希望这对使用 SumUP 集成的人有所帮助,花了一整天的时间才发现...
干杯,
H