51

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

5 回答 5

165

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

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

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

于 2011-07-08T12:39:02.670 回答
22

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

Xcode 4:

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

于 2011-04-25T21:11:16.910 回答
7

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

这可能仅限于拥有一个子项目。就我而言

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

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

解决方法是

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

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

于 2013-07-29T20:18:51.067 回答
1

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

于 2011-04-25T22:13:02.503 回答
0

就我而言,主机应用程序是“自定义”。我不得不将其更改为 iOS 目标并设置“允许测试主机应用程序 API”。您可以在测试目标的常规选项卡上找到它。

主机应用程序设置

于 2021-11-09T15:19:39.077 回答