【问题标题】:Xcode 4 unit testing linker errorXcode 4 单元测试链接器错误
【发布时间】:2011-09-10 05:28:49
【问题描述】:

注意:“使用 GHUnit”不是这个问题的可接受答案。我知道大多数人认为 GHUnit 比 Xcode4 OCUnit 更好,但这不是我要问的。我会单独评估。

我有一个在 Xcode4 中从头开始创建的 Xcode 项目,在创建期间选中了“包括单元测试”复选框。我还包括了一些我在以前的项目中开发的库。它们通过“将文件添加到 x...”对话框添加到项目中,并且仅添加到应用程序目标(而不是测试目标)。它们在运行应用程序时工作正常,所以我认为它们设置正确。我还为这个项目编写了许多不同的类。

我的测试文件以标准方式设置,名为 [AppName]Tests.h 和 .m。
标头代码:
#import < SenTestingKit/SenTestingKit.h >

@interface [AppName]Tests : SenTestCase {
@private
}
@end

实现代码:
#import "[AppName]Tests.h"

@implementation [AppName]Tests

- (void)setUp
{
    [super setUp];
    // Set-up code here.
}

- (void)tearDown
{
    // Tear-down code here.
    [super tearDown];
}  
// Test methods go here
@end

这只是基本骨架。只要我不导入任何其他文件,它在我的其他项目中以及在这个项目中都可以正常工作。当我从该项目导入另一个文件并使用它时,我在 Xcode 输出日志中看到以下错误:
The test bundle at /Users/[Me]/Library/Developer/Xcode/DerivedData/[AppName]-dwuuuwcpmdqxqmgxomoniplwhlpb/Build/Products/Debug-iphonesimulator/[AppName]Tests.octest could not be loaded because a link error occurred. It is likely that dyld cannot locate a framework framework or library that the the test bundle was linked against, possibly because the framework or library had an incorrect install path at link time.

我已经验证过:

  1. 我使用的所有框架都是 添加到“链接二进制文件 应用程序和测试的库” 目标。
  2. 测试目标已配置 正确构建,我所有的 测试方法显示在编辑中 方案...->测试->测试
  3. 除此之外的所有问题 已解决且没有编译器 错误。
  4. 讨论的所有设置 here 设置正确且相同 到我的另一个测试项目 正确。

有什么可能导致这种情况的想法吗?

【问题讨论】:

  • 我遇到了同样的问题。测试运行良好,直到您从主机应用程序分配对象。一整天都被难住了:(
  • @Sam 我已经被难住了一个半月:P 最终我放弃了,并用老式的方式进行了测试。也许新的 Xcode 会修复它,谁知道呢。不过,如果您有任何发现,请告诉我们。
  • 像我之前的许多人一样,我已经放弃了,现在正在使用 GHUnit。设置大约需要 10 分钟。

标签: ios xcode4 linker ocunit


【解决方案1】:

我必须将单元测试目标上的“测试主机”属性设置为$(BUNDLE_LOADER)。这解决了我的问题!

【讨论】:

  • 没有有这个设置,设置它似乎可以做到。它在运行测试时在 iOS 模拟器中启动应用程序,这看起来很奇怪……但现在我的测试实际运行了。
【解决方案2】:

我只是在这个和类似的错误上浪费了几个小时 - 结果我已经重命名了我的主要目标 - 尝试通过重命名相关变量和删除整个 DerivedData 目录来解决这个问题没有成功。

我最终只是按照此处的步骤设置了一个新的单元测试目标: http://twobitlabs.com/2011/06/adding-ocunit-to-an-existing-ios-project-with-xcode-4/

现在一切都很好。

所以 - 如果你有奇怪的、莫名其妙的链接错误,你最好只创建一个新的单元测试目标。只需2分钟。

【讨论】:

  • 如果我再次回到那个项目/平台,我将不得不尝试一下。
  • 谢谢!我也浪费了时间,最终这个简单的解决方案对我有用。
【解决方案3】:

我做了以下事情:
http://twobitlabs.com/2011/06/adding-ocunit-to-an-existing-ios-project-with-xcode-4/

深入了解 Test_Hosts = $(BUNDLE_LOADER)

设置 Test_Hosts 解决了完全相同的问题!

【讨论】:

  • 优秀的链接。非常有价值的信息。
  • 我的 TEST_HOSTS 路径周围的双引号失败,我的 TEST_HOSTS 路径周围的单引号失败,没有引号起作用。顺便说一句,我的系统中该路径中没有空格。
  • 阅读这篇文章解决了我的问题。 Build Settings 选项卡应将 Bundle Loader 设置设置为您的应用名称:$(BUILT_PRODUCTS_DIR)/MyExistingApp.app/MyExistingApp
  • 这也帮助我在 XCode 5 中设置了一个测试目标,xcode 没有为我做的事情,一旦我尝试测试我的应用程序代码就会导致问题,是那里的最后一步,符号默认隐藏需要在主应用程序目标中为 NO。
【解决方案4】:

当我在运行单元测试时遇到链接器错误时,有两件事可以解决我的问题。第一个解决方案是将 Test After Build 构建设置设置为 YES 并选择 Product > Build For > Build For Testing 来运行测试。此解决方案更易于实施。

第二种解决方案是将应用程序的实现文件添加到单元测试目标中。通过选择 View > Utilities > File Inspector 打开文件检查器。在项目导航器中选择一个实现文件。在文件检查器中选中单元测试目标旁边的复选框。

对于在模拟器中运行的 iPhone 应用程序,请确保测试主机构建设置为空白。模拟器不支持应用程序托管的单元测试。

【讨论】:

  • 感谢您的建议,但不幸的是,这些技术都没有解决问题。两者最终都以与以前相同的链接器错误结束。我想可能是时候考虑替代方案了……
  • @Kongress...如果这个答案不起作用,那么你为什么接受它?另外,你有没有找到解决办法?
  • @PengOne 这个问题已经坐了几个星期,这是我得到的唯一回复。虽然它没有解决我的具体问题,但它是彻底和有帮助的。来自 SO 常见问题解答:“当您决定哪个答案对您最有帮助时,将其标记为已接受的答案......”对于等待多长时间没有明确的指导,所以我采取了主动。如果我处理错了,请告诉我以供将来参考。
  • @Kongress... 接受答案完全由您自行决定。我有一个类似的问题,并在搜索时找到了你的问题。因为它有一个“已接受”的答案,所以我认为问题已经解决。对我自己来说,我只在解决问题时才接受答案,以提醒其他人问题仍然存在。有一次,我在 2 个月后收到了正确的答案,我认为如果我接受了一个无效的答案,这个人可能不会打扰。让我重申,接受和赞成投票完全由您自行决定。我问是希望你真的找到了解决办法。
【解决方案5】:

我曾经遇到过同样的问题。出于某种原因,我的项目的一个源文件也包含在为测试目标编译时,这会导致此链接错误。

通过确保只编译测试实现文件,您应该能够解决此错误。您可以在以下位置查看:

TestTarget -> 构建阶段 -> 编译源

【讨论】:

  • 优秀的答案。这解决了我在编译单元测试包时遇到的问题。
  • 我不得不采取相反的方向:只有在我将项目中的 all 源文件添加到测试目标后,链接器错误才消失。从目标中删除任何源文件会使链接器错误再次出现。
【解决方案6】:

运行 Xcode 4.5.2 时遇到此错误 - 现在是 2012 年 11 月 - 以上均无效。似乎设置捆绑加载器和测试主机应该为您填写项目中的所有依赖项 - 或者在您的应用程序环境中运行测试或其他东西,但不幸的是对我不起作用。它所做的是防止特定的 Xcode 警告有关哪些文件/库丢失。

对我有用的是添加一个新目标:cocoa touch 单元测试,(确保包加载器和测试主机构建设置为空),观察构建错误并手动添加缺少的依赖项 - 所有我的项目中需要的源文件,然后是框架。不是很优雅,但我很高兴让它工作。不知道为什么我还没有尝试过这个 GHUnit 库。

【讨论】:

    【解决方案7】:

    确保测试目标已将应用目标配置为依赖项(构建阶段 -> 目标依赖项)。

    【讨论】:

      【解决方案8】:

      我知道这个问题很老了,但我只是在同样的问题上挣扎了一段时间,终于设法解决了,所以让我分享一下我的发现。

      我一直在将一个应用程序从 iOS 移植到 Mac,该项目本身是为 iOS 创建的,因此项目和主要目标在支持的平台上都有 iOS。现在,当我开始移植时,我为 Mac 创建了新目标,并将支持的平台更改为仅针对该目标的 OSX。之后我为单元测试创​​建了另一个目标,但忘记将支持的平台从 iOS 更改为 Mac。我想你应该知道问题出在哪里,基本上单元测试目标默认与 Cocoa 框架链接,因此由于该目标支持的平台只有 iOS,因此从未构建过可可框架,也没有正确链接。将测试目标的支持平台更改为 OSX 解决了该问题。

      我知道这对 iOS 测试目标可能不是很有帮助,但至少去你的测试目标 Link Binary With Libraries 部分看看是否有任何红色库。这给了我这个想法,也许它也会对你们中的一些人有所帮助。

      【讨论】:

        【解决方案9】:

        最近几次合并后我遇到了这个问题,我和同事都向项目中添加了文件,但并非所有实现文件都是单元测试目标的成员。

        解决办法:

        1. 选择一小部分.m 文件(使用“在导航器中过滤”(cmd-opt-j) 搜索.m
        2. 显示文件检查器 (cmd-opt-1) 以查看文件的目标成员身份
        3. 确保适当的文件是您的测试目标的成员。

        注意:如果测试目标复选框显示- 而不是+ 或未选中,则表示部分(但不是全部)选定文件是目标的成员。

        我尝试在合并时使用.xcodeprojproject.pbxproj 文件做更智能的事情,但我每次都因为它的不可思议而放弃了这种方法并转而使用这种方法。

        (另外注意:我一次只选择几个文件有两个原因:

        • 在选择超过7-10个文件时,XCode对文件检查器的性能很差
        • 一些文件不是,不应该是测试目标的成员,并且当所选范围小时,更容易完成消除过程)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-09-21
          • 1970-01-01
          • 2014-02-04
          • 1970-01-01
          • 2014-08-12
          • 1970-01-01
          • 2023-03-26
          • 1970-01-01
          相关资源
          最近更新 更多