【问题标题】:Link error while building a unit test target构建单元测试目标时出现链接错误
【发布时间】:2011-08-12 14:26:47
【问题描述】:

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

我做错了什么?

【问题讨论】:

  • 您的常规目标是应用程序还是静态库?

标签: unit-testing xcode4 linker-errors ocunit


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    Xcode 4:

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

    【讨论】:

    • 将文件添加到编译源消除了错误。那些“编译源”到底是什么?强迫您从主要目标手动添加文件的理由是什么?
    • 每个目标都使用一组独立的源文件。要么您没有将测试目标创建为主要目标的副本,要么在创建 FRRCategory 期间您没有选择两个目标。
    • 这取决于您使用的单元测试框架。您使用的是 Xcode 4 附带的 SenTestingKit 还是其他? …如果您使用的是 SenTestingKit,那么您不想将被测代码添加到您的测试目标中。
    • 编译源是您需要为目标编译的所有实现文件。当您有多个目标时,每个目标都维护自己的一组编译源,并且当您将新文件或现有文件添加到项目时,您应该看到一个复选框选项,其中应包含新文件的目标。这包括图像和资源等资源接口和代码。
    • 这不是这个问题imo的正确答案。检查下面的答案。
    【解决方案3】:

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

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

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

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

    解决办法是

    1. 为应用的 Debug 版本关闭“Dead Code Stripping”。* 和
    2. 确保您的单元测试在 Scheme 设置中使用的是 Debug 而不是 Release。

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

    【讨论】:

    • 这是尝试在设备架构 arm64 上运行单元测试时出现的问题。谢谢
    【解决方案4】:

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

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

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

    【讨论】:

    • 这是大多数人想要关注的答案,而不是提问者检查的答案。这样,应用程序构建产品就像独立使用一样构建,并且测试链接到它。另一种方法是复制所有构建设置、链接器设置等,以与单元测试分开构建源代码。
    • 大声笑,即使在阅读了您的评论后,我仍然搞砸了,我的应用目标上需要“默认隐藏的符号=NO”,而不是测试目标。 +1
    • 这确实是唯一正确的答案。其他答案将您的源代码的两个副本编译成实例化的测试包。虽然通常这会很好,但如果构建工具链中存在错误,您会得到非常奇怪且难以调试的副作用。
    • Symbols Hidden by default = NO for debug mode 解决了我新添加的测试目标的 X-Code 6.3 问题。谢谢。
    • 此解决方案似乎不适用于扩展单元测试,更多解决方案在这里:stackoverflow.com/questions/24627600
    【解决方案5】:

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

    【讨论】:

    • 它没有消除错误,但我不知道没有必要包含该文件夹。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-04
    相关资源
    最近更新 更多