32

替代标题(帮助搜索)

  • 无法在 Xcode 8 中调试链接到 Objective-C 应用程序的 Swift 2.3 框架
  • error in auto-import: failed to get module 'XYZ' from AST contextXcode 8
  • Xcode 8 无法调试 Swift 框架
  • warning: Swift error in module <XYZ>
  • 解决方法;Xcode Debugger 不能调试仅用 Objective-C 编写的应用程序,但只能与仅用 Swift 编写的框架链接。(28312362)

我有一个用 Objective-C 编写的应用程序,它链接到一些用 Swift 2.x 编写的模块(框架)。

问题

一切(调试等)在中工作正常,但是当移动到并更新模块以使用,我无法调试模块。

LLDB 报告了这些错误:

warning: Swift error in module XYZ.
Debug info from this module will be unavailable in the debugger.

error: in auto-import:
failed to get module 'ABC' from AST context

如果我将模块链接到在 Swift 2.3 中构建的应用程序,则不会发生这种情况。

4

11 回答 11

19

对我来说,这既简单又痛苦且耗时:

import SDWebImage 是问题,因为其中一个框架已经包含了 SDWebImage(我看不到它),而该框架恰好是 Objective-C,而应用程序是 Swift。我还将 SDWebImage 添加到项目中,因为我在我编写的类中使用它,而这造成了 Xcode 调试器无法处理的混乱。所以基本上,确保你没有以任何方式重复任何东西,我会检查常见的东西,例如 SDWebImage。

于 2017-01-26T15:02:37.557 回答
10

使用fr v而不是po进行调试

更多调试 https://www.codeproject.com/Articles/1181358/Debugging-with-Xcode

于 2017-08-20T15:24:25.857 回答
9

我在 WWDC 2017 上与一位名叫 Sean 的 Apple 工程师讨论了这个问题。

我的团队花了数周时间试图解决这个问题,结果它成为了 Apple 编译器上的一个错误,我们自己永远无法解决这个问题。此外,它有一个非常简单的解决方法。

编译标志从框架和项目聚合的方式恰好存在一个错误,并且“纯Objective-C”项目“激活”它。

解决方案:在您的 Objective-C 项目中添加一个空的 Swift 文件(“Whatever.swift”或其他),使其不再是纯objective-c(new->file->Swift 文件,不要创建桥接头。该文件将仅包含 Foundation 的导入)。

就是这样。问题解决了。

于 2017-06-08T23:24:10.280 回答
6

tl:博士

在“构建设置”下为您的应用目标添加用户定义的设置。

SWIFT_VERSION = 2.3

SWIFT_VERSION = 2.3 — 构建设置

更多信息

我不确定这是 Xcode 8 的错误还是 Apple 的政策(尝试强制开发人员使用 Swift 3.0?)。但是... 默认情况下,Xcode 8 安装标准 Swift 运行时库的 Swift 3.0 版本。

在使用 LLDM 进行调试时,Swift 2.3 模块无法加载(进入 Swift 3.0 运行时)。

强制应用程序使用 Swift 2.3(或 Apple 所称的旧版 Swift)解决了这个问题。

Swift 应用程序具有由 Xcode 公开的此设置,但您必须为 Objective-C 应用程序手动添加它。

进一步的建议

尽快将您的 Swift 2.3 代码移植到 Swift 3.0,Apple 不会在很长时间内支持 2.x。

于 2016-09-13T10:22:12.237 回答
2

就我而言,我必须Objective-C Bridging header从构建设置文件中删除。我的桥接头文件没有做任何事情..所以没关系。

于 2016-11-30T08:54:43.660 回答
2

error in auto-import: failed to get module 'XYZ' from AST context我在 9.3 模拟器中尝试调试时遇到了该消息。切换到 10.2 模拟器解决了这个问题。

于 2017-03-23T13:42:38.847 回答
2

我在使用 Carthage 构建框架时遇到了这个问题。尝试调试将打印错误,该错误引用了 Obj-C 框架依赖项。

我发现这篇博客文章建议在我的项目中添加以下用户定义的构建设置:

对于调试:REMOVE_HEADERS_FROM_EMBEDDED_BUNDLES = NO

对于发布:REMOVE_HEADERS_FROM_EMBEDDED_BUNDLES = YES

这为我解决了这个问题。

于 2018-03-14T20:47:00.843 回答
0

我只花了 2 天时间就一直通过 print 命令解决和调试。现在我得到了问题:

我的项目在 Swift 中,我使用的 Objective-C 库与在 Swift 中导入的 pod 相同(旧的 Objective-C 项目合并在这个项目中),并且正在使用 import IQKeyboardManager 以及 import "IQKeyboardManager.h" 标头。冲突和删除标题最终解决了我的问题。您可以在库中检查这种类型的重复性。

于 2019-02-13T03:55:39.307 回答
0

在我的情况下,在修复错误 LLDB 重新开始工作后,LLDB 中报告的“C”代码中存在编译器错误。

于 2017-10-24T20:40:55.063 回答
0

正如 Tim https://stackoverflow.com/a/41876400/1840269所建议的那样,我们问题的根本原因是重复问题。

我们有一个用于 SDWebImage 的 obj-c 包装器类别,用于 obj-c 和 Swift。当从 Swift 导入类别时,由于 SDWebImage pod 已经将其自身暴露为 Swift 模块,因此由于重新定义/重复导入,一切都崩溃了。

解决方案?我们将 obj-c 类别重新实现为 Swift 扩展 - 并通过@objc在扩展前面添加并#import "product-Swift.h"从 obj-c 导入文件来继续在 Swift 和 obj-c 中使用它。

也许从检查开始:https ://developer.apple.com/library/content/qa/qa1947/_index.html 。

于 2018-01-31T11:26:41.213 回答
0

尝试重新启动 Xcode。就我而言,它解决了一个问题。

于 2017-10-12T07:40:56.317 回答