升级到Xcode 6 beta 7(现在仍然使用Xcode 6 GM)后,我无法链接我的Swift应用程序。我收到错误,例如:
架构armv7的未定义符号: " _swift_stdlib_compareNSStringDeterministicUnicodeCollation",引自:
...
ld:找不到架构armv7的符号 clang:错误:链接器命令失败,退出代码为1(使用-v查看调用)
我已经看过其他SO帖子建议删除Derived Data文件夹和/或使用Clean Build Folder选项来解决此错误,但该解决方案在我的情况下根本没有帮助。关于我的代码或我使用的CocoaPods没有任何改变,因为Xcode 6 beta 5是最后一次使用它。
有什么想法吗?
编辑:
错误日志的完整发布:
架构arm64的未定义符号: " _swift_stdlib_compareNSStringDeterministicUnicodeCollation",引自: 在BarcodeViewController.o中的TFC12MyProject21BarcodeViewController13captureOutputfS0_FTGSQCSo15AVCaptureOutput_24didOutputMetadataObjectsGSQGSaPSs9AnyObject ___ 14fromConnectionGSQCSo19AVCaptureConnection__T_ " __ TFSs21_arrayConditionalCastU ___ FGSaQ__GSqGSaQ0 _ ",引自: SeordsTableViewController.o中的 TFC12MyProject27SessionsTableViewController17viewWillDisappearfS0_FSbT_ " __ TFSs15_arrayForceCastU ___ FGSaQ__GSaQ0 ",引自: RestApi.o中的__TFC12MyProject7RestApi12tokenMappingfS0_FT_CSo15RKEntityMapping AttendeesTableViewController.o中的__TFC12MyProject28AttendeesTableViewControllerg24fetchedResultsControllerCSo26NSFetchedResultsController SessionsTableViewController.o中的__TFC12MyProject27SessionsTableViewControllerg24fetchedResultsControllerCSo26NSFetchedResultsController BarcodeViewController.o中的__TFC12MyProject21BarcodeViewController13startScanningfS0_FT_Sb " __ TFSs26_forceBridgeFromObjectiveCU__FTPSs9AnyObject_MQ__Q _",引自: RestApi.o中的__TFC12MyProject7RestApi12resetRestKitfS0_FT_T_ BluetoothManager.o中的__TFC12MyProject16BluetoothManager17_startAdvertisingfS0_FT_T_ LoginViewController.o中的__TFC12MyProject19LoginViewController32registerForKeyboardNotificationsfS0_FT_T_ LoginViewController.o中的__TFC12MyProject19LoginViewController35deregisterFromKeyboardNotificationsfS0_FT_T_ LoginViewController.o中的__TFC12MyProject19LoginViewController16callProcessLoginfS0_FT_T_ CheckinViewController.o中的__TFC12MyProject21CheckinViewController16enableBeaconModefS0_FT_T_ BarcodeViewController.o中的__TFC12MyProject21BarcodeViewController13startScanningfS0_FT_Sb ... ld:找不到架构arm64的符号 clang:错误:链接器命令失败,退出代码为1(使用-v查看调用)
答案 0 :(得分:17)
此处发生的事情与您的派生数据位置无关。
构建swift应用程序时,它会经历几个步骤:
编写辅助文件
创建产品结构
为每个架构编译swift源
复制资源规则plist
复制应用程序桥接标题
链接每个架构的swift运行时库
为每个架构复制应用程序swift模块
创建应用程序二进制文件
复制资源构建阶段
将swift标准库复制到应用程序
打包
签名
呼!这很重要。链接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项目文件很复杂并且使用了很多引用 - 合并等可能导致关键引用与链接步骤分离。如果没有完整的构建日志并查看您的计算机,则可能无法分辨。
您可能猜到,此库与项目的派生数据位置无关。
不幸的是,前进的最佳方式是重新创建项目文件。将已损坏项目的构建日志与正确构建的快速项目进行比较可能会提供一些见解,但也可能浪费时间 - 可修复的问题可能是问题,但更可能不是。
我鼓励你提交一个错误并用它包含麻烦的项目文件。
答案 1 :(得分:9)
我通过删除~/Library/Developer/Xcode/DerivedData
文件夹中的所有数据解决了我的问题。我在另一个帖子中读到了这个,但忽略了它认为干净包含了那个过程!
答案 2 :(得分:8)
我已经更新了Yosemite,Xcode 6.1。 我更新了gem xcodeproj(0.19.4)和cocoapods(0.34.4)。
我通过以下方式解决了我的冲突:
清除Library / Developer / Xcode / DerivedData文件夹
替换目标 - >构建设置 - >链接 - >其他链接器标志:$(OTHER_LDFLAGS)
签入目标 - >构建阶段 - > Copy Pods Resources:" $ {SRCROOT} / Pods / Target Support Files / Pods / Pods-resources.sh"
答案 3 :(得分:3)
1)我面临同样的问题,但只是从User/Library/Developer/Xcode/DerivedData
的派生数据中清除应用程序,我就可以运行代码了。
2)在你的情况下,它可以通过从构建设置中删除armv7架构来运行。并确保您的编译器是Build Settings中的Default Compiler。
谢谢,我希望这对您和每个人都有帮助。
答案 4 :(得分:0)
这似乎是由于(大多数情况下)链接不支持所请求架构的第三方库造成的。
答案 5 :(得分:0)
我有一些类似的问题(来自Apple框架的链接器错误)。事实证明,问题是我错过了LocalAuthentication.framework库。我想知道你是否需要从Build Phase选项卡中删除Foundation.framework(在Link Libraries部分中),然后重新添加它?也许这会解决问题?
答案 6 :(得分:0)
'升级'到xcode 6和swift应用程序不会为模拟器构建但在iPad上构建正常 - 链接器错误,模拟器的i386未定义符号。
清除Library / Developer / Xcode / DerivedData文件夹对我有用。
答案 7 :(得分:0)
Xcode 6.0.1中似乎存在一个错误,导致链接器删除现有项目文件中的依赖项。自从6.0.1更新以来,我在新旧各个项目中遇到了同样的问题。
轻松修复'只是删除你的整个' Derrived Data'和所有构建文件(即手动清理项目),然后在重新启动Xcode后重建。奇迹般地,链接器现在找到所有缺少的体系结构/符号。
注意:由于同样的错误导致了几个不兼容的v-table崩溃。 C ++链接器似乎生成了不完整的链接,导致在没有找到真正的错误的情况下出现荒谬的错误。再一次,只需从一个干净的状态重建,然后再进行修复......为自己省去很多头痛,浪费时间追踪非问题。
答案 8 :(得分:0)
我在尝试了所有这里没有运气的建议后解决了这个问题。 就像有人说的那样,它是一个SourceControl问题。
项目浏览器中缺少一个项目文件(错误消息中引用的文件)。但是,XCode仍然有一个对它的引用(当我选择#34时,我将进入类定义;跳转到定义"来自Xcode GUI)。
事实上,project.pbxproj没有列出它。这可能是一个Git问题。无论如何,我只是在重新创建的同一目录中重新创建文件,然后瞧。
答案 9 :(得分:0)
对于iOS Objective C,我是一个小伙子,尽管我已经用其他几种语言编写了多年。所以我在目标C的大部分时间都在黑暗中刺伤。
我在宣布一些" global"之后直接出现了这个错误"架构armv7"的未定义符号。我的.h文件中的变量如下:
extern NSString *globalNotes;
extern NSString *globalUserCountry;
然后我从.m文件中引用这些变量,如下所示:
globalNotes= @"Error (Marker 1010)";
globalUserCountry= @"No result";
修复 - 为了纠正这个问题,我将它们更改为对象属性,如下所示:
@property(nonatomic, strong, readwrite) NSString *globalNotes;
@property(nonatomic, strong, readwrite) NSString *globalUserCountry;
并且像他们一样提到他们:
self.globalNotes= @"Error (Marker 1010)";
self.globalUserCountry= @"No result";
这似乎解决了我的问题。