【问题标题】:Linking error for unit testing with XCode 4?使用 XCode 4 进行单元测试的链接错误?
【发布时间】:2011-09-21 14:38:05
【问题描述】:

我想为我的 XCode 应用程序中的类编写一些逻辑单元测试。在 Xcode 4 中,我在 Project Navigator 中单击项目名称,然后从底部单击 Add Target。我在Other下选择了“Cocoa Touch Unit Testing Bundle”,给新目标一个“产品名”“tests”,然后完成。

因为我要测试的类被编译为我现有应用程序目标的一部分,所以对于我的新“测试”目标,我立即转到“构建阶段”选项卡并将我现有的应用程序目标添加为唯一的目标依赖项。

然后我转到创建的 tests.m 文件,导入我要测试的类(下面是 ReleasePlanManager,并调用它的方法之一。但链接器失败并出现如下错误:

Undefined symbols for architecture i386:
  "_OBJC_CLASS_$_ReleasePlanManager", referenced from:
      objc-class-ref in tests.o
ld: symbol(s) not found for architecture i386
collect2: ld returned 1 exit status

所以找不到该类,即使(根据我的理解)添加应用程序目标(它是它的一部分)就足够了?

任何帮助将不胜感激。谢谢!

【问题讨论】:

标签: objective-c xcode unit-testing linker ocunit


【解决方案1】:

您的测试包需要额外的设置:

  • Bundle Loader 设置为 $(BUILT_PRODUCTS_DIR)/AppName.app/AppName(将两个地方的 AppName 替换为您的应用名称)
  • 测试主机设置为$(BUNDLE_LOADER)

(如果您从头开始创建项目并启用单元测试,这些都是为您设置的。但如果您将单元测试包添加到现有项目,则不是。)

【讨论】:

  • 另外值得注意的是,您的宿主应用程序目标不得配置为 "Symbols Hidden by Default"(在 Build 的 Code Generation 部分设置)用于执行测试的配置。这只是今天早些时候在一个较旧的应用程序上绊倒了我。
  • 我听从了你和 Blake Watters 的建议,现在它给了我:-bundle_loader 只能与 -bundle 一起使用,有什么想法吗?
  • (可能是因为我使用的是 GHUnit 而不是 SenTestingKit 而我正面临这个问题?) - 现在我将所需的源包括到主要目标和测试目标。
  • @ishaq,其他答案早于 Xcode 4 对将测试注入应用程序的支持。我不使用 GHUnit,但不敢相信它会错过这个功能。听起来您的测试目标可能是错误的类型。我会尝试从头开始重新创建它,确保选择单元测试包。然后看看你是否可以让一个依赖于你应用中的类的测试工作。
  • @BlakeWatters 你摇滚!!确实将 "Symbols Hidden by Default" 设置为 NO 就可以了! (文档说默认是YES)
猜你喜欢
  • 2011-09-10
  • 1970-01-01
  • 1970-01-01
  • 2016-11-08
  • 2014-08-12
  • 1970-01-01
  • 2023-03-26
  • 2020-10-23
  • 2018-05-23
相关资源
最近更新 更多