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

时间:2011-04-25 21:07:52

标签: unit-testing xcode4 linker-errors ocunit

我有一个带有常规目标和单元测试目标的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

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

#import "../todoro/FRRCategory.h"

我做错了什么?

4 个答案:

答案 0 :(得分:165)

按照说明here。它不需要您添加任何文件来编译源。

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

无论如何它对我有用。(

答案 1 :(得分:22)

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

Xcode 4:

Project Navigator - > “[项目名称]” - >在目标下选择您的单元测试目标 - >构建阶段 - >展开编译源 - >单击编译源底部的+,然后添加正确的源文件。

答案 2 :(得分:7)

你可能遇到的另一个问题是你的单元测试是否使用了在实际应用中没有使用的C函数(或类似函数)。

这可能仅限于拥有子项目。在我的情况下

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

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

修复是

  1. 为应用程序的Debug build。*和
  2. 关闭“Dead Code Stripping”
  3. 确保您的单元测试在Scheme设置中使用Debug而不是Release。
  4. (*不要对发布配置执行此操作,因为它会使用从未调用过的代码使应用程序膨胀。)

答案 3 :(得分:1)

如果您的文件位于框架内,则只应引用导入中的文件夹。否则,将文件添加到项目后,只需执行#import "FRRCategory.h"即可。好吧,除非你对你的标题搜索路径做了一些奇怪的事情。