Xcode unittest build失败,出现错误"架构x86_64的未定义符号"

Yuw*_*Yan 44 xcode ios

我的unittest目标构建失败,出现以下错误:

Undefined symbols for architecture x86_64:
  "_OBJC_CLASS_$_MCStore", referenced from:
      objc-class-ref in MCStoreTests.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Run Code Online (Sandbox Code Playgroud)

基本信息:

  • Xcode6.2
  • iOS8.2 SDK

我检查了什么:

  • Symbols Hidden by Default 没有
  • Other Linker Flags 是-framework XCTest
  • Framework Search Paths 是$(SDKROOT)/ Developer/Library/Frameworks $(继承)

Yuw*_*Yan 96

根据这个链接,我需要Bundle Loader在unittest目标中设置以下内容Build Settings

$(BUILT_PRODUCTS_DIR)/MyExistingApp.app/MyExistingApp

  • 为什么这样做?为什么这在XCode中没有开箱即用? (5认同)
  • 这个答案是救命的老兄!!! 我很高兴我偶然发现它!非常感谢!!! (4认同)
  • 这些线路值得金!非常感谢.帮助我在单元测试,ui-test和不同部署目标的项目中解决无限的Mach-O链接器错误. (4认同)
  • 我必须使用XCode 8.2创建的全新项目来完成这项工作. (3认同)
  • 另外注意 - 步骤 > 返回您的应用程序目标(而不是测试目标),将默认隐藏的符号构建设置设置为否 此选项仅在您在构建设置下选择“全部”时可见 (3认同)
  • 我也添加了 Bundle Loader - $(TEST_HOST)。在目标 C 和 Swift 中使用 xcode 9.2 (2认同)
  • 谢谢你!这解决了我的 UITest 目标中的问题“架构 x86_64 _OBJC_CLASS_ 的未定义符号”。我也花了很多时间在这个问题上。 (2认同)

Ben*_*ker 11

至少从Xcode 7.3测试目标开始,您可以选择"主机应用程序".在测试目标(但目前不是UI测试目标)中,这会自动填充"测试主机"构建设置,但不会填充"捆绑加载器",这可能导致找不到类.

考虑到这一点,如果将测试目标的"Bundle Loader"Build Setting设置为$(TEST_HOST),即使您更改了Host Application,它也将始终包含正确的值.

这实际上 @ yuwen-yan发布的链接中给出的建议相反,应该相当于减少工作量.

  • 我发现`$(TEST_HOST)`是默认配置,但是仍然找不到我的一个pod. (2认同)
  • 在 Xcode9.2 中,它现在位于“测试目标”>“构建设置”>“测试”>“测试主机”下。添加 $(TEST_HOST) 仍然有效。不过,我也更新了我的 cocoapods。 (2认同)

Pet*_*erg 8

这个错误可能是由于测试目标类型错误,即ui test target

UI 测试目标不能使用 main target 的内部结构,甚至不能使用@testable导入。单元测试目标 OTOH 可以使用内部结构。

在此答案中查看更多详细信息。

(我相信这在某些 XCode 版本中发生了变化,这会导致混淆。典型的方法是在 ui 测试目标中包含来自原始目标的大量文件。正确的方法是设计 UI 测试,使它们不不需要或使用来自主要目标的大量代码。)


use*_*951 7

就我而言,当我需要测试属于我的应用程序一部分的框架中存在的类时,我收到此错误:

\n\n

测试框架类。
\n1. 将测试目标添加到 macOS 。
\n2. 选择项目/目标窗口。选择测试目标。
\n3. 转到 \xe2\x80\x9cbuildphases\xe2\x80\x9d、\xe2\x80\x9clink 二进制文件与库\xe2\x80\x9d,添加要测试的框架。
\n4. 在测试类(安装/拆卸)中,将 \xe2\x80\x9cimport\xe2\x80\x9d 添加到要从该框架测试的类

\n


Raz*_*Raz 5

遇到了同样的问题。对我来说修复它的在 Testing target 中设置enable modules (c and objective-c)YESBuild Settings