Xcode 4单元测试链接器错误

时间:2011-06-07 16:08:48

标签: ios xcode4 linker ocunit

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

我有一个Xcode项目,我是从头开始在Xcode4中创建的,在创建过程中选中了“Include unit tests”复选框。我还包括了我在之前项目中开发的一些库。它们通过“Add Files to 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. 我使用的所有框架都是 添加到“Link Binary with 库“适用于应用程序和测试 目标。
  2. 已配置测试目标 正确建立和我所有的 测试方法显示在编辑中 方案...-&GT;性能测试 - &GT;测试
  3. 每一个问题,但这一个问题 解决了并且没有编译器 错误。
  4. 讨论了所有设置 here 设置正确且相同 到我测试的其他项目 正确。
  5. 有关可能导致此问题的任何想法?

9 个答案:

答案 0 :(得分:13)

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

答案 1 :(得分:7)

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

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

现在一切都很好。

所以 - 如果你有奇怪的,无法解释的链接错误,你可能最好只创建一个新的单元测试目标。只需2分钟。

答案 2 :(得分:7)

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

深入了解 Test_Hosts = $(BUNDLE_LOADER)

将Test_Hosts设置为完全相同的问题!

答案 3 :(得分:4)

当我遇到运行单元测试的链接器错误时,有两件事可以解决我的问题。第一种解决方案是将Test After Build构建设置设置为YES,然后选择Product&gt; Build for&gt; Build For Testing以运行测试。这个解决方案更容易实现。

第二种解决方案是将应用程序的实现文件添加到单元测试目标。选择View&gt;打开文件检查器。公用事业&gt;文件检查员。在项目导航器中选择一个实现文件。选择文件检查器中单元测试目标旁边的复选框。

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

答案 4 :(得分:1)

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

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

TestTarget - &gt;构建阶段 - &gt;编译来源

答案 5 :(得分:1)

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

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

答案 6 :(得分:0)

确保测试目标将app目标配置为依赖项(Build Phases - &gt; Target Dependencies)。

答案 7 :(得分:0)

我知道这个问题已经过时了,但我在一段时间内遇到了同样的问题并最终设法解决了,所以让我分享一下我发现的问题。

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

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

答案 8 :(得分:0)

我最近几次合并后遇到了这种情况,我和同事都在项目中添加了文件,而且并非所有的实现文件都是单元测试目标的成员。

解决方案:

  1. 选择一小部分.m个文件(使用“在导航器中过滤”(cmd-opt-j)搜索.m
  2. 显示文件检查器(cmd-opt-1)以查看文件的目标成员资格
  3. 确保相应的文件是测试目标的成员。
  4. 注意:如果测试目标复选框显示-而非+或未选中,则表示某些(但不是全部)所选文件属于目标成员。

    我尝试在合并时使用.xcodeproj的{​​{1}}文件做更多智能的事情,但我每次都因为它的不可思议性而感到沮丧并且放弃了这种方法

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

    • 当选择7-10个以上的文件时,Xcode对文件检查器的性能很差
    • 某些文件不是也不应该是测试目标的成员,并且当所选范围很小时,更容易进行消除过程。)