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

问题描述 投票:35回答:10

我的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 $(继承)
ios xcode
10个回答
86
投票

根据这个link,我需要在单位测试目标Bundle Loader中设置低于内容的Build Settings

$(BUILT_PRODUCTS_DIR)/MyExistingApp.app/MyExistingApp


-2
投票

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

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

9
投票

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

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

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


4
投票

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


2
投票

在我的特殊情况下,我试图测试release配置,并得到这个特殊的错误。在尝试了不同的编译标志后,我发现在我的项目中设置Enable Testability用于发布配置(不是特定的目标,但可能也可以工作)。

enter image description here


1
投票

此错误可能是测试目标类型错误的结果,即ui测试目标。

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

See more details in this answer.

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


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

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

0
投票

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

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


0
投票

在我的情况下,当我需要测试存在于我的app中的框架中的类时,我遇到了这个错误:

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

© www.soinside.com 2019 - 2024. All rights reserved.