Xcode unittest build失败,出现错误"未定义的符号用于体系结构x86_64"

时间:2015-06-19 10:16:38

标签: ios xcode

我的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 $(继承)

11 个答案:

答案 0 :(得分:86)

根据此link,我需要在单元测试目标Bundle Loader

中设置Build Settings以下内容

$(BUILT_PRODUCTS_DIR)/MyExistingApp.app/MyExistingApp

答案 1 :(得分:9)

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

考虑到这一点,如果将测试目标的“Bundle Loader”构建设置设置为<input id="search" type="text"/> <div class="list"> <div id="el"> red </div> <div id="el"> blue </div> <div id="el"> red green </div> </div>,即使您更改了Host Application,它也将始终包含正确的值。

这有效地与@ yuwen-yan链接中给出的建议相反的,应该相当于减少工作量。

答案 2 :(得分:4)

遇到同样的问题。 修复此问题的方法是在测试目标enable modules (c and objective-c)中将Build Settings设置为

答案 3 :(得分:2)

Xcode 12.3 (12C33) – 我刚刚删除了测试目标和所有引用。然后创建新的测试目标,并添加回我所有的测试文件 ✓ 正常工作

答案 4 :(得分:1)

此错误可能是由于测试目标类型错误,即 ui测试目标

UI测试目标不能使用主要目标的内部,即使导入@testable也是如此。单元测试目标OTOH可以使用内部部件。

See more details in this answer.

(我相信这已经在某些XCode版本中发生了变化,这引起了混乱。典型的方法是将来自原始目标的大量文件包含在ui测试目标中。一种正确的方法是以这种方式设计UI测试他们不需要或使用主要目标中的大量代码。)

答案 5 :(得分:1)

在我的特定情况下,我试图测试release的配置,但遇到此特定错误。在尝试了不同的编译标志之后,我发现为项目上的发布配置设置Enable Testability(不是特定的目标,但可能也可以)达到了目的。

enter image description here

答案 6 :(得分:0)

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

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

答案 7 :(得分:0)

所以这对我有用...

override func setUp() {

    super.setUp()

    let promise = expectation(description: "App has finished running")

    DispatchQueue.global(qos: .background).async{
        // Wait on the background thread
        sleep(4)
        DispatchQueue.main.async {
            // Fullfill the promise in the main thread
            promise.fulfill()
        }
    }

    // Initialize the storyboard
    let storyboard = UIStoryboard(name: "Main", bundle: nil)

    // Get the view controller
    sut = storyboard.instantiateViewController(withIdentifier: String(describing: ViewController.self)) as? ViewController
    _ = sut.view

    waitForExpectations(timeout: 5) { (_) in
        // Finish set up after the app is done running its code
    }

}// End setUp() Method

答案 8 :(得分:0)

对我有用的只是在podfile上使用测试目标。

target 'MyAppName' do
  use_frameworks!

  pod 'SwiftLint'
  pod 'RxSwift'
  pod 'RxCocoa'
  pod 'RxDataSources'
  pod 'RxGRDB'

  target 'UnitTestTarget' do
    inherit! :search_paths  
  end
end

答案 9 :(得分:0)

就我而言,当我需要测试属于我的应用程序的 framework 中存在的类时,会出现此错误:

测试框架类。
1.将测试目标添加到macOS。
2.选择项目/目标窗口。选择测试目标。
3.转到“构建阶段”,“将二进制文件与库链接”,添加要测试的框架
4.在测试类(设置/拆卸)中,向要从该框架测试的类中添加“ import”

答案 10 :(得分:-2)

以下是在尝试在Xcode 9中添加单元测试目标时执行以解决问题的步骤:

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