【问题标题】:MacOS Swift Framework testing failMacOS Swift 框架测试失败
【发布时间】:2014-08-31 09:46:03
【问题描述】:

我有一个用 obj-c 和 swift 编写的框架。

现在我尝试运行一个相关的单元测试目标,但是我得到了这个错误:

2014-07-10 07:45:54.064 xctest[4908:303] The test bundle at /Users/steve/Temporary/Build/Products/Debug/SOGraphDB-Mac Tests.xctest could not be loaded because an unanticipated error occurred: Error Domain=NSCocoaErrorDomain Code=3587 "The bundle “SOGraphDB-Mac Tests” couldn’t be loaded because it is damaged or missing necessary resources." (dlopen_preflight(/Users/steve/Temporary/Build/Products/Debug/SOGraphDB-Mac Tests.xctest/Contents/MacOS/SOGraphDB-Mac Tests): Library not loaded: @rpath/libswiftAppKit.dylib
  Referenced from: /Users/steve/Temporary/Build/Products/Debug/SOGraphDB.framework/Versions/A/SOGraphDB
  Reason: image not found) UserInfo=0x10011c640 {NSLocalizedFailureReason=The bundle is damaged or missing necessary resources., NSLocalizedRecoverySuggestion=Try reinstalling the bundle., NSFilePath=/Users/steve/Temporary/Build/Products/Debug/SOGraphDB-Mac Tests.xctest/Contents/MacOS/SOGraphDB-Mac Tests, NSDebugDescription=dlopen_preflight(/Users/steve/Temporary/Build/Products/Debug/SOGraphDB-Mac Tests.xctest/Contents/MacOS/SOGraphDB-Mac Tests): Library not loaded: @rpath/libswiftAppKit.dylib
  Referenced from: /Users/steve/Temporary/Build/Products/Debug/SOGraphDB.framework/Versions/A/SOGraphDB
  Reason: image not found, NSBundlePath=/Users/steve/Temporary/Build/Products/Debug/SOGraphDB-Mac Tests.xctest, NSLocalizedDescription=The bundle “SOGraphDB-Mac Tests” couldn’t be loaded because it is damaged or missing necessary resources.}

知道根本原因是什么吗? 该错误似乎与“未加载库:@rpath/libswiftAppKit.dylib”有关

(框架和测试包)编译时没有任何错误或警告(在 Beta2 中)

【问题讨论】:

  • 尝试清理一切并重建
  • 请检查是否包含 libswiftAppKit.dylib 以测试捆绑包成员身份
  • 1.清洁和重建是我首先解决任何问题的标准方法。 2. no libswiftAppKit.dylib 不包含在测试包中,为什么呢?
  • 顺便说一句。使用 beta4 我有同样的问题。
  • 看来这个问题现在已经在 Xcode6-BETA5 中修复了。

标签: frameworks swift xctest


【解决方案1】:

我遇到了类似的问题,虽然我的是一个 iOS 测试目标,链接到一个 Swift 框架,但无法在 Xcode 6 GM 上运行。测试目标已经在 Xcode 6 的早期 beta 上成功运行,但最终版本报告了运行时错误:Library not loaded: @rpath/libswiftCore.dylib

我注意到一个较新的项目没有失败,所以我比较了构建设置和测试代码。我能够通过三个步骤解决问题:

  1. 测试目标需要“嵌入式目标包含 Swift 代码”设置为 YES。这告诉链接器将 Swift 运行时库添加到可执行文件中。

  2. 测试目标需要明确的“运行路径搜索路径”构建设置值。这告诉加载器在哪里可以找到 Swift 运行时库。我从一个全新的测试目标复制了以下设置:

    LD_RUNPATH_SEARCH_PATHS = $(inherited) @executable_path/../Frameworks @loader_path/../Frameworks
    
  3. 测试用例需要显式导入链接框架使用的任何模块。在我的项目中,框架使用了 UIKit,但测试用例只使用了我的框架。当我在测试用例中添加明确的import UIKit 时,链接问题就消失了。

【讨论】:

  • 包括LD_RUNPATH_SEARCH_PATHS = $(inherited) @executable_path/Frameworks @loader_path/Frameworks 为我工作!谢谢!
  • 好的,我在 Xcode 6.1 上又遇到了这个问题。这三个步骤对我没有帮助。我(重新)打开了我的错误报告,希望苹果会为 xcode 目标设置添加一些检查。
  • 好吧,我不得不再试一次,并创建了一个新的测试目标。但同样的问题它不起作用。如果手动添加 libswiftAppKit.dylib 它会运行。
  • 这真的很有帮助!特别是第三步为我解决了问题。
  • 第 2 步为我修复了它。第 1 步似乎没有必要。
【解决方案2】:

因为每当我弄乱构建设置时我都会遇到这个问题,所以这是我在 Xcode 8b5 中可以提供的最简洁的答案:

如果单元测试不能在 iOS 上运行,请确保您有:

运行路径搜索路径@loader_path/Frameworks

如果单元测试未在 ma​​cOS 上运行,请确保您有:

运行路径搜索路径@loader_path/../Frameworks

这将在您的 pbxproj 文件中显示为 LD_RUNPATH_SEARCH_PATHS。您还可以添加 $(inherited) 以确保也添加了项目范围的路径,但这些路径可能是空的。

最后,我不需要 executable_path/... 设置,无论它们是否用于单元测试,对我来说都没有区别。

【讨论】:

    【解决方案3】:

    我遇到了同样的问题。

    最终将 libswiftAppKit.dylib 从 Xcode 应用程序目录(我使用的是 beta 3)复制到我可以引用的目录(不是应用程序包的一部分),然后将该库添加到“Link binary with libraries " 测试包的设置。然后我的测试开始工作。

    仅供参考,dylib 的路径位于 '/Applications/Xcode6-Beta3.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/macosx/libswiftAppKit.dylib'

    可能不是一个好的最终解决方案,但它适用于临时。

    【讨论】:

    • 我接受这个答案,因为它现在也适用于我(现在可能是 beta4)。正如你所说,不是最好的解决方案,但我们仍处于测试阶段
    • 我现在又遇到了同样的问题 Beta 6。
    • 我现在为它打开了一个错误报告 (18113337)
    • 最后一个错误报告已关闭,我为 Xcode 6.1 (19069079) 重新打开另一个错误报告
    【解决方案4】:

    我的解决方案是将单个文件添加到我的测试目标 AppKitTests.swift(或 AppKitSpec.swift 在我的情况下),所有文件包含:

    // While I don't know why, The.framework is built linked to libswiftAppKit.
    // Frameworks do not embed the Swift libraries themselves, it's up to the host
    // app to include the necessary libraries. So here we are, including AppKit on
    // behalf of The.framework so that the tests can run.
    import AppKit
    

    哦,我还把 AppKit 添加到了测试目标的框架集中。

    【讨论】:

    • 我发现了同样的事情,为 OS X 测试添加了import Cocoa
    • 我有一个应用程序,作为实验,我决定在链接到应用程序的框架内使用 swift 文件。它在链接到 AppKit 时出现问题,所以我按照您的建议做了,使用 import AppKit 将一个空的 swift 文件添加到顶级应用程序,它工作了 :)
    【解决方案5】:

    我在 Beta 4 中遇到过这种情况,结果证明是我自己在没有意识到的情况下做到了这一点。

    我有一个名为 Fnord 的框架项目。我的 FnordTests 目标包含几个单元测试类,每个文件的顶部都有 import Fnord。出于某种原因,Xcode 抱怨这些导入,所以我将它们注释掉。这是我在尝试运行单元测试时开始出现相同症状的时候。

    我注意到我的 FnordTests 目标的设置是这样的,即目标将与 Fnord.framework 链接,我意识到它可能无法使用前面提到的 import Fnord 语句进行删除。

    所以我把它们放回去,一切都恢复了正常。奇怪的是,Xcode 不再显示这些导入语句有问题,但这是测试版,所以我可以原谅。

    我希望这对某人有所帮助。

    【讨论】:

    • 感谢您的回答,但这不是我的问题。我在 iOS 和 MacOS 中有(或多或少)相同的代码。在 iOS 上它适用于 MacOS 我收到此错误。因此,如果我开始调试,iOS 上的 xcode 会崩溃 :)
    【解决方案6】:

    我遇到了同样的问题,添加

    import AppKit
    

    在 Swift 文件中修复了它

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-14
      • 2014-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-19
      相关资源
      最近更新 更多