【问题标题】:Xcode 6 linker error - Undefined symbols for architecture armv7Xcode 6 链接器错误 - 架构 armv7 的未定义符号
【发布时间】:2014-11-04 02:21:43
【问题描述】:

升级到 Xcode 6 beta 7(现在仍然使用 Xcode 6 GM)后,我无法链接我的 Swift 应用程序。我收到如下错误:

架构 armv7 的未定义符号: “_swift_stdlib_compareNSStringDeterministicUnicodeCollat​​ion”,引用自:

...

ld:未找到架构 armv7 的符号 clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)

我看到其他 SO 帖子建议删除 Derived Data 文件夹和/或使用 Clean Build Folder 选项来解决此错误,但该解决方案在我的情况下根本没有帮助。自 Xcode 6 beta 5 以来,我的代码或我使用的 CocoaPods 没有任何变化,这是它最后一次工作。

有什么想法吗?

编辑:

错误日志的完整张贴:

架构 arm64 的未定义符号: “_swift_stdlib_compareNSStringDeterministicUnicodeCollat​​ion”,引用自: TFC12MyProject21BarcodeViewController13captureOutputfS0_FTGSQCSo15AVCaptureOutput_24didOutputMetadataObjectsGSQGSaPSs9AnyObject___14fromConnectionGSQCSo19AVCaptureConnection__T_ 在 BarcodeViewController.o “__TFSs21_arrayConditionalCastU___FGSaQ__GSqGSaQ0_”,引用自: TFC12MyProject27SessionsTableViewController17viewWillDisappearfS0_FSbT_ in SessionsTableViewController.o “__TFSs15_arrayForceCastU___FGSaQ__GSaQ0”,引用自: RestApi.o 中的 __TFC12MyProject7RestApi12tokenMappingfS0_FT_CSo15RKEntityMapping __TFC12MyProject28AttendeesTableViewControllerg24fetchedResultsControllerCSo26NSFetchedResultsController in AttendeesTableViewController.o __TFC12MyProject27SessionsTableViewControllerg24fetchedResultsControllerCSo26NSFetchedResultsController 在 SessionsTableViewController.o BarcodeViewController.o 中的 __TFC12MyProject21BarcodeViewController13startScanningfS0_FT_Sb “__TFSs26_forceBridgeFromObjectiveCU__FTPSs9AnyObject_MQ__Q_”,引用自: __TFC12MyProject7RestApi12resetRestKitfS0_FT_T_ 在 RestApi.o __TFC12MyProject16BluetoothManager17_startAdvertisingfS0_FT_T_ in BluetoothManager.o __TFC12MyProject19LoginViewController32registerForKeyboardNotificationsfS0_FT_T_ 在 LoginViewController.o __TFC12MyProject19LoginViewController35deregisterFromKeyboardNotificationsfS0_FT_T_ 在 LoginViewController.o __TFC12MyProject19LoginViewController16callProcessLoginfS0_FT_T_ 在 LoginViewController.o __TFC12MyProject21CheckinViewController16enableBeaconModefS0_FT_T_ 在 CheckinViewController.o BarcodeViewController.o 中的 __TFC12MyProject21BarcodeViewController13startScanningfS0_FT_Sb ... ld:未找到架构 arm64 的符号 clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)

【问题讨论】:

  • 傻逼你重启了吗?
  • 嗯,不。我想我会试试的。
  • 我得到了这个,我仍然安装了 beta 5 - 即使在对最近的快速更新进行了一些更改之后,相同的项目在 beta 5 中构建良好,没有代码更改。
  • 您是否尝试在 xCode6GM 中创建新项目并运行一些基本场景?唯一与 Beta 不同的是游乐场结构,所以我删除并创建了新的。
  • 我不是 iOS 大师,反正我从 beta 5 迁移到 6 时遇到了类似的问题。尝试使用代码签名,清除所有字段并再次选择

标签: ios xcode swift linker upgrade


【解决方案1】:

这里发生的事情与您的派生数据位置无关。

当一个 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 项目文件很复杂并且使用了大量的引用 - 合并等可能导致关键引用与链接步骤分离。如果没有完整的构建日志并查看您的机器,可能无法判断。

您可能猜到,这个库与项目的派生数据位置无关。

不幸的是,最好的方法是重新创建项目文件。将损坏项目的构建日志与正确构建的快速项目进行比较可能会提供一些见解,但这也可能是浪费时间 - 一些可修复的问题可能是问题,但更可能不是。

我鼓励您提交一个错误并在其中包含麻烦的项目文件。

【讨论】:

  • 这是我需要的信息。我知道这与 DerivedData 无关,这就是我首先提出这个问题的原因。已经有很多关于 DerivedData 问题的答案。我没有尝试仔细研究所有构建日志和设置并找出丢失的内容,而是重新创建项目并将我的代码移入其中。当我有时间时,我会尝试比较两个项目之间的差异。感谢您的帮助。
  • 只是跟踪任何人的后续行动......我从头开始重建我的项目并复制了我的所有设置和代码。它现在构建得很好。没有多少清洁派生数据有帮助,我尝试了很多这个概念的排列。因此,正如 quellish 所说,问题实际上与派生数据无关,而是该项目内部的一些东西,无法轻易清理或擦除。至少我现在又开始行动了。
  • 你有没有对项目进行比较?
【解决方案2】:

我已通过删除 ~/Library/Developer/Xcode/DerivedData 文件夹中的所有数据解决了我的问题。我在另一个线程中读到了这一点,但忽略了它,认为清理包含该过程!

【讨论】:

  • 在将 Xcode 升级到 Xcode 6 GM Seed 后,我开始收到链接器错误,并且清除此文件夹解决了这些错误。
  • 我已经删除了该文件夹中的所有数据。我首先清理了项目。然后我退出 Xcode 并删除了 DerivedData 文件夹。然后我重新启动了 Xcode 并构建了应用程序。同样的错误。
【解决方案3】:

我已经更新了 Yosemite,Xcode 6.1。 我更新了 gem xcodeproj (0.19.4) 和 cocoapods (0.34.4)。

我已经解决了我的冲突:

清除 Library/Developer/Xcode/DerivedData 文件夹

替换目标 -> 构建设置 -> 链接 -> 其他链接器标志:$(OTHER_LDFLAGS)

签入 Target -> Build Phases -> Copy Pods Resources : "${SRCROOT}/Pods/Target Support Files/Pods/Pods-resources.sh"

【讨论】:

  • 这对我来说没什么区别 :(
【解决方案4】:

1) 我面临同样的问题,但只需从User/Library/Developer/Xcode/DerivedData 的派生数据中清除应用程序,我就可以运行代码。

2) 在您的情况下,它将通过从构建设置中删除 armv7 架构来运行。并确保您的编译器是构建设置中的默认编译器。

谢谢,我希望这对你和每个人都有帮助。

【讨论】:

  • 放弃 armv7 并不是一个真正的选择,因为我需要支持 iPhone 4s。我试着放下它只是为了看看,然后它用 arm64 失败了。
  • 是的,你是对的,你的项目中有 .a 文件吗?因为也许那个 .a 文件不是 armv7 和 arm64 的编译。并查看未找到架构 arm64 clang 的错误符号:错误:链接器命令失败,退出代码为 1
【解决方案5】:

这似乎是(大多数情况下)由链接不支持所请求架构的第三方库引起的。

【讨论】:

  • 我删除了所有的 pod,但仍然遇到这个问题。
  • 我支持你,@BradR,无论如何它似乎都会发生。即使仅引用 Apple 框架,也会出现链接器错误。
【解决方案6】:

我遇到了一些类似的问题(来自 Apple 框架的链接器错误)。事实证明,问题在于我缺少库 LocalAuthentication.framework。我想知道您是否需要从“构建阶段”选项卡(在“链接库”部分)中删除 Foundation.framework,然后重新添加它?也许这会解决问题?

【讨论】:

    【解决方案7】:

    “升级”到 xcode 6 和 swift 应用程序无法为模拟器构建,但可以在 iPad 上正常构建 - 链接器错误,模拟器的 i386 未定义符号。

    清除 Library/Developer/Xcode/DerivedData 文件夹对我有用。

    【讨论】:

      【解决方案8】:

      Xcode 6.0.1 中似乎存在一个错误,导致链接器删除现有项目文件中的依赖项。自 6.0.1 更新以来,我在几个不同的新旧项目中都遇到了同样的问题。

      简单的“修复”是丢弃整个“派生数据”和所有构建文件(即手动清理项目),然后在重新启动 Xcode 后重新构建。神奇的是,链接器现在可以找到所有缺失的架构/符号。

      注意:我遇到过几次不兼容的 v-table 崩溃,都是由同一个错误引起的。 C++ 链接器似乎生成了不完整的链接,导致无法找到真正 错误的荒谬错误。同样,只需从一个干净的状态进行重建,然后.. ta da.. 为自己省去很多头痛和浪费时间追踪非问题的时间。

      【讨论】:

        【解决方案9】:

        在尝试了这里建议的所有方法后,我解决了这个问题,但没有成功。 就像之前有人说的那样,这是一个 SourceControl 问题。

        项目浏览器中缺少我的一个项目文件(错误消息中引用的那个)。然而,XCode 仍然有一个对它的引用(当我从 Xcode GUI 中选择“跳转到定义”时,我正在进入类定义)。

        事实上,project.pbxproj 并没有列出它。这可能是一个 Git 问题。无论如何,我只是在它被重新创建的同一目录中重新创建了文件,瞧。

        【讨论】:

          【解决方案10】:

          虽然我多年来一直在使用其他几种语言进行编码,但在 iOS 目标 C 方面我是个小白痴。所以我大部分时间都在用Objective C在黑暗中刺痛。

          在我的 .h 文件中声明了一些“全局”变量后,我开始遇到此错误“架构 armv7 的未定义符号”,如下所示:

          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";
          

          这似乎解决了我的问题。

          【讨论】:

            猜你喜欢
            • 2015-10-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-08-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-07-19
            相关资源
            最近更新 更多