构建单元测试目标时链接错误

cfi*_*her 52 unit-testing linker-errors ocunit xcode4

我有一个带有常规目标和单元测试目标的XCode4/iOS项目.一切正常,除非我尝试#import我的测试类中的一个类并尝试使用它.如果我尝试构建单元测试目标,我会收到以下链接错误:

Undefined symbols for architecture i386:
  "_OBJC_CLASS_$_FRRCategory", referenced from:
      objc-class-ref in CategoryTests.o
ld: symbol(s) not found for architecture i386
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

在CategoryTests.m中,我以这种方式导入头文件:

#import "../todoro/FRRCategory.h"
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Mar*_*man 165

按照此处的说明操作.它不需要您添加任何文件来编译源.

我首先错过了"默认隐藏的符号=否"应该适用于您的应用目标,而不是测试目标.

无论如何它对我有用(tm).

  • 保佑你,先生! (4认同)
  • 这确实是唯一正确的答案.其他答案将源的两个副本编译成实例化的测试包.虽然通常情况下这很好,但如果构建工具链中存在错误,您将会遇到非常奇怪且难以调试的副作用. (4认同)
  • 大声笑,即使在阅读你的评论后,我仍然搞砸了,并且在我的应用目标上需要"默认隐藏的符号=否",而不是测试版.+1 (3认同)

Joe*_*Joe 22

确保已将FRRCategory源文件添加到单元测试目标的编译源中.

Xcode 4:

Project Navigator - >"[Project Name]" - >在Targets下选择您的单元测试目标 - > Build Phases - > Expand Compile Sources - >单击Compile sources底部的+并添加正确的源文件.

  • 这不是这个问题的正确答案.检查下面的答案. (27认同)
  • 这取决于您使用的单元测试框架.您使用的是Xcode 4附带的SenTestingKit还是其他什么?...如果你正在使用SenTestingKit,那么你_don't_想要将测试中的代码添加到你的测试目标. (4认同)

Kal*_*lle 7

您可能遇到的另一个问题是,如果您的单元测试使用的是实际应用中未使用的C函数(或类似函数).

这可能仅限于拥有子项目.就我而言

  • 应用
    • 分项目
      • 嵌入式AC库(即直接在里面编译的.c和.h文件)

我的单元测试使用了一些其他地方没有使用过的C函数,这些函数从app二进制文件中删除(不是从子项目的.a文件中删除).

修复是

  1. 关闭应用程序的Debug版本的"死代码剥离".*和
  2. 在Scheme设置中确保您的单元测试使用Debug而不是Release.

(*不要对发布配置执行此操作,因为它会使用从未调用过的代码使应用程序膨胀).