更新到Xcode 6 beta 4并使用Swift后,出现了dyld_fatal_error错误

40

我最近下载了 Xcode 6 beta 4,我的 Swift 项目编译没有错误,但在运行我的代码之前,调用堆栈中 start 上方就发生 dyld_fatal_error。

调用堆栈

同时,在一些汇编代码中有一个 nop 指令的断点。

断点

控制台报错信息如下:

dyld: lazy symbol binding failed: Symbol not found: __TFSsa6C_ARGVGVSs13UnsafePointerGS_VSs4Int8__
  Referenced from: /Users/username/Library/Developer/Xcode/DerivedData/Sudoku-dhrdonaeqzsgcvewndimxbbsltnc/Build/Products/Debug/Sudoku.app/Contents/MacOS/Sudoku
  Expected in: /Users/username/Library/Developer/Xcode/DerivedData/Sudoku-dhrdonaeqzsgcvewndimxbbsltnc/Build/Products/Debug/Sudoku.app/Contents/MacOS/../Frameworks/libswift_stdlib_core.dylib

dyld: Symbol not found: __TFSsa6C_ARGVGVSs13UnsafePointerGS_VSs4Int8__
  Referenced from: /Users/username/Library/Developer/Xcode/DerivedData/Sudoku-dhrdonaeqzsgcvewndimxbbsltnc/Build/Products/Debug/Sudoku.app/Contents/MacOS/Sudoku
  Expected in: /Users/username/Library/Developer/Xcode/DerivedData/Sudoku-dhrdonaeqzsgcvewndimxbbsltnc/Build/Products/Debug/Sudoku.app/Contents/MacOS/../Frameworks/libswift_stdlib_core.dylib

只是让您知道,该项目仍然可以使用Xcode 6 beta 3进行编译和运行。


5
你尝试过清理+构建吗? - jtbandes
实际上不,让我试试。 - o.uinn
哇,我感觉好蠢啊,谢谢@jtbandes的回答,我会接受它的。 :) - o.uinn
我也遇到了这个问题!尝试下面提出的重启解决方案... - leonard
12个回答

75

大多数类似这样极为奇怪的问题都可以通过清除并重新构建(或者重新启动Xcode)来解决。你还可以考虑从~/Library/Developer/Xcode/DerivedData中删除相关文件夹。


5
没错!清理并重新构建是解决方案! - leonard
1
我在系统上同时安装了Xcode 6和6.1,结果发现6.0试图使用6.1的派生数据文件夹...所以,是的,删除该文件夹并进行清理/构建操作解决了问题!谢谢! - serenn
2
对于遇到类似问题的人,我想补充一下,这个问题可能与很多原因有关。在下面的答案中,描述了许多不同的解决方法,所以如果第一个解决方案不起作用,值得查看以下内容。这些包括:1.清理,2.手动删除文件夹,3.将框架添加到嵌入式二进制文件中,4.将框架添加到复制阶段,5.更改部署目标,6.清除库缓存,7.证书问题等。 - Andrej

25

毫无疑问,这个错误信息非常不友好:

dyld`dyld_fatal_error:
->  0x1200ad088 <+0>: brk    #0x3

这当然只会在设备上发生,而不是模拟器。这是始终在设备上测试的另一个好理由。

无论如何,我遇到了同样的问题,清理并没有起作用。删除DerivedData也没有帮助。也尝试过同步部署目标版本,但似乎没有任何区别。

解决方案是在Target -> General下的嵌入式二进制设置中添加任何动态框架:

setting an embedded binary

现在我知道其他答案中已经提到了这一点。但是,如果我可以补充说明任何相关的动态框架也必须包括在内。

例如,如果您有一个依赖于动态框架B的动态框架A,则必须将A和B添加到嵌入式二进制文件中。

请注意,如果动态框架A依赖于任何静态库或框架,则您几乎肯定会被迫将A创建为包含依赖二进制文件的 umbrella 框架。

可能重要的其他考虑因素。然而,对于我个人来说,确实导致成功的是:

  • 检查检查器中每个动态库的路径是否设置为“相对于组”。在上面的截屏中,嵌入式二进制文件的路径似乎正确终止于"build/Debug-iphoneos"
  • 动态框架位于嵌入式二进制文件部分。静态库和封装为框架的静态库位于链接的框架和库中。没有出现在两个部分中。

在设置这一点时 XCode 的行为很奇怪。下面的步骤被证明是成功的:

  1. 将动态框架添加到嵌入式二进制文件中。
  2. 在左侧的XCode组中找到新框架并更新路径为“相对于组”,如前所述。
  3. 从嵌入式二进制文件中删除动态框架。
  4. 再次将动态框架添加到嵌入式二进制文件中。此时路径应该正确显示。
  5. 从链接的框架和库中删除所有动态框架的引用。

非常好的回答。你有没有想过为什么有时动态框架(例如cocoa touch框架)在项目导航器中显示为黄色手提箱,而其他时候则显示为一个白色乐高盒子,其中一条边朝外?我想知道这是否反映了Xcode导入框架的不同方式,但我不知道差异可能是什么,或者它是否对使用框架有重要影响。 - algal
2
我也发现出门转三圈并吐口水有所帮助。 - James Robinson
非常感谢,这很有帮助。我很好奇,这些是dylib导入吗? - Arunav Sanyal

17

我刚刚遇到了这个问题,尝试将自定义的iOS框架链接到我的项目中,所以对于所有遇到此问题的人来说,与拷贝文件的构建阶段有关。

我认为当找不到文件时会出现此错误。因此,在项目的适当目标中创建一个拷贝文件的构建阶段。然后将文件添加到此阶段(如果是框架,请确保选择“Frameworks”目标)。


2
很好的提示。这正是我在寻找的。显然其他人正在寻找其他东西,但这对于框架来说是必要的。 - plivesey
谢谢。你为我节省了无数个寻找的小时。这在Xcode 7 beta中仍然是一个问题。 - Garoal

9
清理、重启、删除等方法对我无效。
我的项目包含另一个项目。当我在iOS 7上运行该项目且在代码中访问了“被包含”的项目时,应用程序会停止在下面的行:
(图片)
经过多天的尝试,我发现“容器”项目的部署目标是7.0(如下图所示)。
(图片)
而另一方面,“被包含”的项目的部署目标为8.1(如下图所示)。
(图片)
将“被包含”的项目的部署目标更改为7.0解决了我的问题!
(图片)
注意:“该项目在iOS 8设备上工作正常。”

对于我的问题来说非常准确。我不认为我改变了我的部署目标,所以我不确定这是否发生在某些自动设置更新期间。令人沮丧。 - BLE

7
我最近遇到了这个问题,我的问题是我添加了来自同一项目的一个库,但该库未列在“常规”部分的“嵌入式二进制文件”中。
注意:如果您将其添加到嵌入式二进制文件中,则还将添加到链接库部分,可能会将同一个库添加两次。

1
谢谢:对于设备,“嵌入式二进制文件”是必需的,而在模拟器上,“链接框架”就足够了。不管怎样,这对我很有帮助,谢谢! - Dan Rosenstark
我非常确定真正的答案是“停止所有这些疯狂的行为,使用Cocoapods...”由于某种原因,这次我忘记了它们 - 当事情令人沮丧时,我早就放弃了它们 - 但我将重新开始。 Cocoapods周围有很多文档,并且来自世界各地的人们都非常喜欢它。你甚至可以做到这一点:私有存储库 - Dan Rosenstark
@DanRosenstark 是的,使用CocoaPods非常好,可能会缓解这个问题。我建议使用它们(实际上,Swift应该也有自己的模块管理器)。然而具有讽刺意味的是,在我的CocoaPod示例项目遇到这个问题之后,我发布了我的原始答案o.O - bitwit
抱歉,您是说在按照Cocoapods HelloWorld的说明操作后出现了此问题?(又是另一个管理器...真糟糕!?) - Dan Rosenstark
@DanRosenstark 不用担心,如果你使用CocoaPods,一切都应该没问题。 - bitwit
显示剩余2条评论

5
清理并构建无效。您需要删除 ~/Library/Caches/com.apple.dt.Xcode* 目录中的缓存。删除这些缓存后重新构建。
每次升级 beta 版本时,请执行此操作。

4
我也遇到了同样的问题,尝试了上面提供的所有解决方案都没有成功。然后我做了什么来解决,我真的不太清楚。所以在钥匙串访问中的系统组中有一个名为“apple worldwide developer relations certificate authority”的证书,由于某些配置文件和证书问题,我随机将此证书从“使用系统默认值”标记为“始终可信”。这导致了我的“dyld_fatal_error”崩溃。当我将其恢复为“使用系统默认值”时,崩溃就解决了。 enter image description here 因此,如果您已经尝试了所有可能的选项来解决此崩溃,但尚未成功,请尝试这个方法。它帮助了我,也许对您有帮助。 发现了关于此证书的this

1
我的问题不在Apple全球证书上,而是在特定的开发者证书上。因此,请尝试将所有开发者配置文件设置为“使用系统默认值”。 - haik.ampardjian
谢谢Suryakant Sharma。这正是我犯的错误。我花了几个小时寻找这个问题,直到我偶然发现了你的答案。对我非常有用。 - Vinayak
这个方法可行,但我还需要进行深度清理,然后关闭并重新打开Xcode。 - Lance Samaria

1
这个问题仍然存在于Xcode 7中,而且可能由于各种原因(看起来是这样)。在我的情况下,iOS应用程序包含一个框架:
  1. 模拟器上运行正常
  2. 在设备上出现了您描述的错误
答案是不要使用链接库,而是使用“常规”下的“嵌入式二进制文件”。 另请参见:https://dev59.com/gWAf5IYBdhLWcg3wOQm2#34052368

1
将非系统框架添加到主项目的常规选项卡中的“嵌入式二进制文件”中对我有用。
如bitwit所述,这也会将您的框架添加到“链接的框架和库”,因此要注意重复。
在Xcode 7.3下测试通过。

1

Xcode 8.

清理并构建未能奏效。我删除了缓存,删除了派生数据。之后,我的Pods配置被破坏了,所以我需要重新安装Pods。Pods目标配置设置为非常旧的有效架构。将其设置为armv7和armv7s,编译正常,没有问题。


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