Xcode 6的链接错误 - 架构armv7的未定义符号
升级到Xcode 6 beta 7(现在仍然使用Xcode 6 GM)后,我无法链接我的Swift应用程序。我收到错误,如:Xcode 6的链接错误 - 架构armv7的未定义符号
Undefined symbols for architecture armv7: "_swift_stdlib_compareNSStringDeterministicUnicodeCollation", referenced from:
...
ld: symbol(s) not found for architecture armv7 clang: error: linker command failed with exit code 1 (use -v to see invocation)
我所看到的其他SO推荐删除导出的数据文件夹和/或使用干净生成文件夹选项,以获取过去的这个错误的帖子,但这种解决办法根本没有帮助所有在我的情况。自从最后一次使用Xcode 6 beta 5以来,我的代码或CocoaPods没有任何改变。
任何想法?
编辑:
错误日志的完整发布:通过链接不支持请求的架构的第三方库
Undefined symbols for architecture arm64: "_swift_stdlib_compareNSStringDeterministicUnicodeCollation", referenced from: TFC12MyProject21BarcodeViewController13captureOutputfS0_FTGSQCSo15AVCaptureOutput_24didOutputMetadataObjectsGSQGSaPSs9AnyObject___14fromConnectionGSQCSo19AVCaptureConnection__T_ in BarcodeViewController.o "__TFSs21_arrayConditionalCastU___FGSaQ__GSqGSaQ0_", referenced from: TFC12MyProject27SessionsTableViewController17viewWillDisappearfS0_FSbT_ in SessionsTableViewController.o "__TFSs15_arrayForceCastU___FGSaQ__GSaQ0", referenced from: __TFC12MyProject7RestApi12tokenMappingfS0_FT_CSo15RKEntityMapping in RestApi.o __TFC12MyProject28AttendeesTableViewControllerg24fetchedResultsControllerCSo26NSFetchedResultsController in AttendeesTableViewController.o __TFC12MyProject27SessionsTableViewControllerg24fetchedResultsControllerCSo26NSFetchedResultsController in SessionsTableViewController.o __TFC12MyProject21BarcodeViewController13startScanningfS0_FT_Sb in BarcodeViewController.o "__TFSs26_forceBridgeFromObjectiveCU__FTPSs9AnyObject_MQ__Q_", referenced from: __TFC12MyProject7RestApi12resetRestKitfS0_FT_T_ in RestApi.o __TFC12MyProject16BluetoothManager17_startAdvertisingfS0_FT_T_ in BluetoothManager.o __TFC12MyProject19LoginViewController32registerForKeyboardNotificationsfS0_FT_T_ in LoginViewController.o __TFC12MyProject19LoginViewController35deregisterFromKeyboardNotificationsfS0_FT_T_ in LoginViewController.o __TFC12MyProject19LoginViewController16callProcessLoginfS0_FT_T_ in LoginViewController.o __TFC12MyProject21CheckinViewController16enableBeaconModefS0_FT_T_ in CheckinViewController.o __TFC12MyProject21BarcodeViewController13startScanningfS0_FT_Sb in BarcodeViewController.o ... ld: symbol(s) not found for architecture arm64 clang: error: linker command failed with exit code 1 (use -v to see invocation)
这里发生了什么与您的Derived Data位置无关。
当SWIFT应用程序建立起来,它要经过几个步骤:
写辅助文件
创建产品结构
编译迅速源为每建筑
复制资源规则plist
复印应用桥接报头
针对迅速运行时库链接每个建筑
复印应用为每个架构
创建应用程序二进制迅速模块
复印资源建立相
复制迅疾标准库到应用程序
包起来
签署
呼!好多啊。与swift运行时库链接时,您的构建失败。他们住在Xcode开发人员目录内的Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/iphoneos
。具体而言,未正确链接的库是libswiftCore.dylib
。如果您在使用库nm
,你可以看到它定义了你的第一个丢失的符号:
quellish% nm /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/iphoneos/libswiftCore.dylib | grep compareNSStringDeterministicUnicodeCollation
00197c8c T _swift_stdlib_compareNSStringDeterministicUnicodeCollation
000000000018352c T _swift_stdlib_compareNSStringDeterministicUnicodeCollation
您还可以使用lipo
看什么架构的文件中:
quellish% xcrun lipo -info /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/iphoneos/libswiftCore.dylib
Architectures in the fat file: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/iphoneos/libswiftCore.dylib are: armv7 arm64
它包含的ARMv7和arm64。这不是图书馆架构的问题。
与swift标准库的链接不起作用。源代码管理或迁移Xcode版本可能导致您的项目文件丢失部分链接步骤,或者无法找到需要链接的库。 Xcode项目文件很复杂并且使用了很多引用 - 合并等可能导致关键引用从链接步骤中分离出来。如果没有完整的构建日志和看看你的机器,可能无法说清楚。
您可能会猜到,此库与项目的派生数据位置无关。
不幸的是,最好的方法是重新创建项目文件。将破碎项目的构建日志与正确构建的快速项目进行比较可能会提供一些见解,但这也可能是浪费时间 - 可解决的问题可能是问题,但更可能不是。
我会鼓励你提交一个bug,并将它包含在麻烦的项目文件中。
这是我需要的信息。我知道它与DerivedData无关,因此我首先创建了这个问题。有关DerivedData问题的答案已经很多了。与其试图分析所有的构建日志和设置,弄清楚下降的是什么,我正在重新创建项目并将代码移入其中。当我有时间的时候,我会尝试比较两个项目之间的差异。谢谢您的帮助。 – davidethell 2014-09-22 11:08:05
只是跟踪任何人跟踪...我从头开始重建我的项目,并复制了我的所有设置和代码。它现在建立得很好。没有任何清洁派生数据有帮助,我尝试了很多排列的概念。正如奎里什说的那样,这个问题实际上与派生数据无关,但是这个项目内部的东西无法被轻易清理或抹去。至少我现在回来了。 – davidethell 2014-10-20 10:59:34
你有没有比较项目? – MarcusJ 2015-09-12 12:45:23
这似乎引起的(大多数)。
我删除了所有的豆荚,但我仍然遇到这个问题。 – 2014-09-10 18:25:44
我与你在一起,@BradR,无论如何,它似乎都会发生,甚至在仅引用Apple框架时也会出现链接器错误 – davidethell 2014-09-10 21:35:54
我已经通过删除~/Library/Developer/Xcode/DerivedData
文件夹中的所有数据解决了我的问题。我在另一个线程中读到了这个,但忽略它认为一个干净的过程!
我开始获取在将Xcode升级到Xcode 6 GM Seed后出现连接器错误,并清除该文件夹解决了错误 – zeeple 2014-09-11 20:33:37
我已经删除了该文件夹中的所有数据,我首先清理了该项目,然后退出Xcode并删除了DerivedData文件夹。然后我重新启动了Xcode并构建了应用程序。同样的错误 – davidethell 2014-09-12 10:28:24
不适用于我.. – Ilario 2015-07-29 09:11:45
我有点类似的问题(从苹果的框架链接器错误)。事实证明,问题是我错过了LocalAuthentication.framework库。我想知道是否需要从构建阶段选项卡(链接库部分)中删除Foundation.framework,然后重新添加它?也许这将解决问题?
1)我面临同样的问题,但只清除来自User/Library/Developer/Xcode/DerivedData
的派生数据的应用程序,我能够运行代码。
2)在您的情况下,它可以通过从构建设置中删除armv7架构来运行。并确保你的编译器是Build Settings中的默认编译器。
谢谢,我希望这对你和每个人都有帮助。
丢弃armv7并不是真正的选择,因为我需要支持iPhone 4s。我试图放弃它只是为了看到,然后用arm64失败。 – davidethell 2014-09-22 01:01:04
是的你是对的,你的项目中是否有.a文件?因为也许.a文件不是armv7和arm64的汇编。并看看你的错误符号(s)没有找到架构arm64 clang:错误:链接器命令失败,退出代码1 – 2014-09-22 07:26:50
'升级'为xcode 6和swift应用程序不会建立模拟器,但会建立罚款iPad - 链接器错误,为模拟器i386未定义的符号。
清除Library/Developer/Xcode/DerivedData文件夹为我工作。
Xcode 6.0.1中似乎存在一个错误,导致链接器删除现有项目文件中的依赖项。自从6.0.1更新以来,我在几个不同的新老项目中遇到了同样的问题。
简单的'修复'是只是垃圾你的整个'衍生数据'和所有生成文件(即手动清理项目),然后重新生成一个新的Xcode重新启动后。神奇地,链接器现在找到所有缺少的架构/符号。
注意:我有几个不兼容的V表崩溃导致这个相同的错误。 C++链接器似乎正在生成不完整的链接,在没有发现实际的错误的情况下导致了荒谬的错误。再次,只需从干净的状态重建,然后..塔达..节省自己很多头痛,浪费时间追踪一个非问题。
我更新了Yosemite,Xcode 6.1。 我已经更新了gem xcodeproj(0.19.4)和cocoapods(0.34.4)。
我解决我的冲突:
清除库/开发/ Xcode中/ DerivedData文件夹
替换目标 - >构建设置 - >链接 - >其他链接标志:$(OTHER_LDFLAGS)
入住目标 - >构建阶段 - >复制荚资源:“$ {} SRCROOT /荚/目标支持文件/荚/ Pods-resources.sh”
这为我解决了,谢谢! – Jake 2014-11-06 11:15:43
这对我来说没有任何区别:( – PostCodeism 2015-10-08 21:57:19
我想一切都表明,后解决了这个问题这里没有运气。 就像之前说过的那样,这是一个SourceControl问题。
项目浏览器中缺少我的项目文件之一(错误消息中引用的文件)。然而,XCode仍然有一个引用(当我从Xcode GUI中选择“跳转到定义”时,我正在进入类定义)。
事实上,project.pbxproj没有列出它。这可能是一个Git问题。无论如何,我只是在重新创建的同一目录中重新创建文件,并且瞧。
当谈到iOS Objective C时,我非常喜欢,尽管多年来我一直在用其他几种语言编写代码。所以我在大部分时间用Objective C刺伤我。
我开始在我的.h文件中声明一些“全局”变量之后,出现了这个错误,“Undefined symbols for architecture armv7”,如下所示:
extern NSString *globalNotes;
extern NSString *globalUserCountry;
我当时指的是这些变量。M档像这样:
globalNotes= @"Error (Marker 1010)";
globalUserCountry= @"No result";
THE FIX - 要解决这个问题,我改变了他们反对像这样的属性:
@property(nonatomic, strong, readwrite) NSString *globalNotes;
@property(nonatomic, strong, readwrite) NSString *globalUserCountry;
,并提到他们像这样:
self.globalNotes= @"Error (Marker 1010)";
self.globalUserCountry= @"No result";
那似乎解决了我的问题。
愚蠢的一个,但你重新启动? – Woodstock 2014-09-10 12:33:29
嗯,不。猜猜我会尝试。 – davidethell 2014-09-10 12:50:25
重新启动没有帮助 – davidethell 2014-09-10 14:40:28