升级到 Xcode 6 beta 7(现在仍然使用 Xcode 6 GM)后,我无法链接我的 Swift 应用程序。我收到如下错误:
架构armv7的未定义符号:
“_swift_stdlib_compareNSStringDeterministicUnicodeCollation”,引用自:
...
ld:未找到架构armv7的符号
clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
我已经看到其他 SO 帖子建议删除派生数据文件夹和/或使用清理构建文件夹选项来解决此错误,但该解决方案对我来说根本没有帮助。自上次运行 Xcode 6 beta 5 以来,我的代码或我使用的 CocoaPods 没有任何变化。
有任何想法吗?
EDIT:
错误日志的完整发布:
架构arm64的未定义符号:
“_swift_stdlib_compareNSStringDeterministicUnicodeCollation”,引用自:BarcodeViewController.o 中的 TFC12MyProject21BarcodeViewController13captureOutputfS0_FTGSQCSo15AVCaptureOutput_24didOutputMetadataObjectsGSQGSaPSs9AnyObject___14fromConnectionGSQCSo19AVCaptureConnection__T_
“__TFSs21_arrayConditionalCastU___FGSaQ__GSqGSaQ0_”,参考自:SessionsTableViewController.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 查看调用)
这里发生的事情与您的派生数据位置无关。
当构建一个 swift 应用程序时,它会经历以下几个步骤:
写入辅助文件
创建产品结构
为每个架构编译swift源码
复制资源规则 plist
复制应用程序桥接标头
链接每个架构的 swift 运行时库
为每个架构复制应用程序 swift 模块
创建应用程序二进制文件
复制资源构建阶段
将 swift 标准库复制到应用程序中
打包起来
Sign it
哇!好多啊。链接到 swift 运行时库时,您的构建失败。他们住在Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/iphoneos
在 Xcode 开发者目录中。具体来说,未正确链接的库是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 项目文件很复杂并使用大量引用 - 合并等可能会导致关键引用与链接步骤分离。如果没有完整的构建日志并查看您的机器,可能无法判断。
正如您可能猜到的那样,该库与项目的派生数据位置无关。
不幸的是,前进的最佳方法是重新创建项目文件。将损坏项目的构建日志与正确构建的 swift 项目进行比较可能会提供一些见解,但这也可能是浪费时间 - 问题可能是可以修复的,但更可能不是。
我鼓励您提交错误并包含麻烦的项目文件。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)