XCode unittest构建失败,出现错误“架构x86_64的未定义符号”

我的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) 

基本信息:

  • Xcode6.2
  • iOS8.2 SDK

我检查了什么:

  • Symbols Hidden by Default为否
  • Other Linker Flags是-framework XCTest
  • Framework Search Paths是$(SDKROOT)/ Developer / Library / Frameworks $(inheritance)

根据此链接 ,我需要在unittest目标Build Settings中将Bundle Loader设置为低于内容

$(BUILT_PRODUCTS_DIR)/MyExistingApp.app/MyExistingApp

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

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

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

经历过同样的问题。 为我修复的在测试目标Build Settings中将enable modules (c and objective-c)YES

将测试目标添加到之前创建2或3个XCode版本的旧项目后遇到相同的链接器错误。 此外,项目有各种xcodeproject / target / bundle名称。 所有可能的重命名清理Build settingsBuild phasesScheme操作对我来说都不起作用。

经过长时间的努力,实际工作的是在最新的Xcode版本中从头开始重新创建项目以及所有目标 。 它终于链接了! 在这种情况下,您甚至不需要手动修改Search pathsBundle loader ,Xcode将为您完成。

以下是我在Xcode 9中尝试添加unit testing目标时为解决问题而执行的步骤:

  1. 转到“管理方案”。
  2. 点击底部的“+”按钮。
  3. 选择新添加的目标并选择“确定”。
  4. 确保为新添加的目标选择“共享”选项。