Xcode 6 链接错误 - 架构 armv7 的符号未定义

24
升级到Xcode 6 beta 7(现在仍然使用Xcode 6 GM),我无法链接我的Swift应用程序并收到错误,如下所示:
“Undefined symbols for architecture armv7: "_swift_stdlib_compareNSStringDeterministicUnicodeCollation", referenced from:”
我看到其他SO文章建议删除Derived Data文件夹和/或使用Clean Build Folder选项以解决此错误,但这个解决方案在我的情况下没有帮助。自从Xcode 6 beta 5以来,我的代码或CocoaPods使用都没有更改,那时它最后一次工作。
有任何想法?
编辑:
错误日志的完整发布:...
说明:此段文字涉及编程问题的细节,翻译难度较大,可能需要专业人士进行翻译。

你重启过电脑吗? - Woodstock
好的,不是这样。我猜我会试一下。 - davidethell
你是否按照这个帖子中描述的所有步骤都做了? - rdurand
你能否发布构建日志中报告此错误的行?它会告诉你具体有哪个库出了问题。 - quellish
很好。这只是这个项目,对吧?当你创建一个新的Swift测试项目时,你不会看到相同的东西吗? - quellish
显示剩余6条评论
10个回答

18
这里发生的事情与您的派生数据位置无关。
当一个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项目文件很复杂,使用了许多引用 - 可能合并等原因导致关键引用与链接步骤脱离联系。如果没有完整的构建日志和查看您的机器,可能无法确定。
这个库,正如你所猜测的那样,与项目的派生数据位置无关。
不幸的是,向前推进的最佳方法是重新创建项目文件。将损坏的项目的构建日志与可以正确构建的Swift项目进行比较,可能会提供一些见解,但也可能是浪费时间 - 可能存在可修复的问题,但更有可能不存在。
我鼓励您提交错误,并将有问题的项目文件包括在内。

2
这就是我需要的信息。我知道它与DerivedData无关,这也是我首先创建这个问题的原因。已经有很多SO答案涉及DerivedData问题。与其试图研究所有构建日志和设置并找出哪些被删除,我选择重新创建项目并将代码移入其中。等我有时间了,我会尝试比较两个项目之间的差异。感谢您的帮助。 - davidethell
1
这是一个跟进,给那些正在追踪的人...我从头开始重建了我的项目,并复制了所有的设置和代码。现在它可以成功编译了。清理派生数据再多也没有用,我试了很多方法。所以就像quellish说的一样,问题实际上与派生数据无关,而是该项目内部的某些东西,不容易清理或擦掉。至少现在我又可以继续工作了。 - davidethell
你有没有对比过这些项目? - MarcusJ

11

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


我在将Xcode升级为Xcode 6 GM Seed后开始收到链接器错误,清除此文件夹解决了这些错误。 - zeeple
我已经删除了那个文件夹中的所有数据。我首先清理了项目。然后退出Xcode并删除了DerivedData文件夹。然后重新启动Xcode并构建应用程序。仍然出现相同的错误。 - davidethell

8

我已经升级到Yosemite和Xcode 6.1。

我更新了gem xcodeproj(0.19.4)和cocoapods(0.34.4)。

我通过以下方式解决了冲突:

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

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

检查目标中的- >构建阶段 - >复制Pods资源:"${SRCROOT}/Pods/Target Support Files/Pods/Pods-resources.sh"


这对我没有任何影响 :( - PostCodeism

3

1) 我遇到了同样的问题,但是只需清除来自User/Library/Developer/Xcode/DerivedData的派生数据中的应用程序,我就能运行代码。

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

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


放弃 armv7 不是一个真正的选择,因为我需要支持 iPhone 4s。我试着放弃它,结果失败了,因为还需要 arm64。 - davidethell
是的,你说得对,你的项目中有.a文件吗?因为那个.a文件或许不是armv7和arm64的编译结果。并且请看一下你的错误符号,它们是否针对arm64这种架构无法找到。clang:错误:链接器命令失败,退出码1。 - Bhavesh Lathigara

0

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

解决方法 - 为了纠正这个问题,我将它们更改为对象属性,如下所示:

@property(nonatomic, strong, readwrite) NSString *globalNotes;
@property(nonatomic, strong, readwrite) NSString *globalUserCountry;

然后这样引用它们:

self.globalNotes= @"Error (Marker 1010)";
self.globalUserCountry= @"No result";

那似乎解决了我的问题。


0

在尝试了这里提出的所有建议但没有成功后,我解决了这个问题。 就像有人之前说的那样,这是一个源代码控制问题。

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

事实上,project.pbxproj没有列出它。这可能是Git问题。无论如何,我只是在相同的目录中重新创建了文件,然后问题就解决了。


0

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

简单的“解决”方法是删除整个“派生数据”和所有构建文件(即手动清理项目),然后在重新启动Xcode后重新构建。神奇的是,链接器现在找到了所有缺失的架构/符号。

注意:我曾因为这个相同的错误而遇到过几次不兼容的v表崩溃。C++链接器似乎生成了不完整的链接,导致出现荒谬的错误,而实际上并没有真正的错误。再次从干净的状态重新构建,.. ta da..可以节省很多头痛和浪费时间追踪非问题。


0

我曾经遇到过类似的问题(苹果框架链接错误)。结果发现,问题在于我缺少了 LocalAuthentication.framework 库。我想知道是否您需要从“链接库”部分的“构建阶段”选项卡中删除 Foundation.framework,然后再重新添加它?或许这能够解决问题?


0

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

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


0

这似乎是由于链接不支持所请求的架构的第三方库引起的(对于大多数人而言)。


我移除了所有的Pod,但仍然遇到了这个问题。 - Brad R
我和你一样,@BradR,无论如何似乎都会发生这种情况。即使只引用苹果框架,链接器错误也会发生。 - davidethell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接