【问题标题】:XCTest/XCTest.h not found on old projects built in Xcode 6在 Xcode 6 中构建的旧项目中找不到 XCTest/XCTest.h
【发布时间】:2014-08-08 03:41:45
【问题描述】:

我有几个项目正在尝试使用 Xcode 6 Beta 2 构建。这些项目都有一些使用 XCTest(Kiwi/XCTest 和 Specta)的库,这些库在 Xcode 6 中没有构建,因为 XCTest/XCTest .h 找不到。

fatal error: 'XCTest/XCTest.h' file not found
#import <XCTest/XCTest.h>

我注意到 XCTest.framework 不再在“Link Libraries with Binaries”构建阶段列表中,但这很好,因为当我使用 Xcode 6 创建一个 new 项目时,该库似乎已链接自动进入。

也许有些相关性,我需要 XCTest 的依赖项都是通过 Cocoapods 引入的。

有什么我不知道我需要更新我的项目吗?

【问题讨论】:

    标签: ios xcode cocoapods xctest


    【解决方案1】:

    注意:这对于在 Xcode 7 中创建的任何项目可能都不需要。

    CocoaPods 对此 herehere 进行了修复


    为了解决任何 CocoaPod 依赖项的问题,您需要在任何需要 XCTest(例如 Kiwi、Specta、FBSnapshotTestCase 等)的 Pod 目标中将以下内容添加到 FRAMEWORK_SEARCH_PATHS

    $(PLATFORM_DIR)/Developer/Library/Frameworks

    这将允许您在可能拥有的任何依赖项中引用 XCTest。这可能会在 CocoaPods 或您引用的 Pod 的未来更新中得到修复,因此您可能希望稍后将其删除。

    它对早期版本的 Xcode 无害,因此应该可以安全使用。

    【讨论】:

    • 谢谢 Squarefrog。相关问题是here
    • 下一个版本计划什么时候发布?
    • 这似乎不适用于 xcode 6 GM 中的 KIM..?
    • 我不同意“与 Xcode 7 无关”。我在 Xcode 7.1 中遇到了问题。在我按照上面的说明添加框架搜索路径后,问题就消失了。我认为在 Xcode 7 中启动的项目不会有问题,但这里的问题是在较新的 Xcode 中构建旧项目。
    • 从 XCode 9 开始,您应该将 FRAMEWORK_SEARCH_PATHS 构建设置设置为 $(DEVELOPER_FRAMEWORKS_DIR) 和 $(inherited)
    【解决方案2】:

    我正在移动项目中的文件。 您所要做的就是选择您的测试文件xxxTests.m 等,并在file inspector 中选择target 作为test 而不是常规目标。

    【讨论】:

    • 正是发生在我身上的事情。我没有注意到当我移动它时,文件的目标“改变了”。我应该根据它的移动方式来考虑它(在 Xcode 中删除并重新添加)。谢谢。
    • 对我有用的简单答案。我在重命名文件时遇到了问题,这就是我的解决方案。
    【解决方案3】:

    我注意到 XCTest 仅可用于测试目标(在 Xcode 6 中)。如果您将 XCTest 用于任何其他目标(无论出于何种原因),您将看到 XCTest.h not found 错误。

    【讨论】:

    • 就是这样。 Cocoapods 创建静态库项目/目标。很好的发现!
    • 您很可能需要将所有与 XCTest 相关的代码移动到测试目标。
    • 如果您使用 CocoaPods 在项目中包含 Kiwi 或 Specta,这会很困难。
    • 那么...解决方法是什么?
    【解决方案4】:

    当您添加了一个在测试目标之外使用 XCTest 的文件时,会出现此错误。要在 AppCode 中解决此问题,您可以右键单击任何可疑文件并选择“管理目标”,然后确保仅选中测试目标。

    【讨论】:

    • 我不止一次遇到过这个问题。
    • 这发生在我在项目中移动文件并将它们重新添加到错误的目标下之后。
    【解决方案5】:

    @squarefrog 有 right answer,但每次更新 pod 时,您都必须手动执行此操作:(

    如果你把它添加到你的 podfile 中,它会自动为你添加额外的路径。例如。如果你想为 Specta 添加$(PLATFORM_DIR)/Developer/Library/FrameworksFRAMEWORK_SEARCH_PATHS

    post_install do |installer|
        target = installer.project.targets.find { |t| t.to_s == "Pods-Tests-Specta" }
        if (target)
            target.build_configurations.each do |config|
                s = config.build_settings['FRAMEWORK_SEARCH_PATHS']
                s = [ '$(inherited)' ] if s == nil;
                s.push('$(PLATFORM_DIR)/Developer/Library/Frameworks')
                config.build_settings['FRAMEWORK_SEARCH_PATHS'] = s
            end
        else
            puts "WARNING: Pods-Tests-Specta target not found"
        end
    end
    

    【讨论】:

    • 请注意,您可能需要更改"Pods-Tests-Specta" 以匹配您的项目设置,或者只需使用@squarefrog 建议的循环遍历每个目标。
    • 我说错了-@squarefrog 没有建议循环。我的意思是将@deanWombourne 解决方案中的第 2-3 行替换为:installer.project.targets.each do |target 以遍历所有目标并应用更改。
    【解决方案6】:

    在我从构建阶段导入 XCTest 框架并解决了问题一段时间后,我遇到了同样的问题。

    构建阶段-> XCTest.Framework>清理并运行。我希望它对某人有所帮助..

    供您参考...Import XCTest in to existing project

    【讨论】:

    • 这对我有用,但我还必须转到新测试的目标设置并在常规选项卡上选中用于测试应用程序 API 的框。
    【解决方案7】:

    截至撰写本文时,最新版本的 Cocoapods (0.33.1) 尚未解决该问题。

    但最先进的版本可以。

    关注this guide 从源代码设置最新版本的 Cocoapods。我打电话给我的pod-dev(在指南中介绍)以将其与安装 gem 的 pod 版本区分开来。

    这种方法的好处是您不需要在 Podfile 中编写额外的脚本。您只需要记住使用pod-dev install 而不是通常的pod install

    【讨论】:

      【解决方案8】:

      拥有 XCTest 的最佳方法是从 Test Navigator(左窗格中的第 5 个图标)添加它。

      这样做,新的xx.m 测试文件不针对(在右窗格中)应用程序(在左窗格中>目标,包装器扩展:应用程序),而是一个包(包装器扩展:xctest)

      • XCTest.framework 仍为红色,
      • 由于进行了一些修改,您可能会遇到错误'XCTest/XCTest.h' file not found,这是因为您的文件必须以应用为目标。

      【讨论】:

        【解决方案9】:

        这是我发现的最简单的解决方法。无需更改项目。并且此更改将持续到您的下一次 Xcode 升级:

        cd /Applications/Xcode6-Beta7.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator8.0.sdk/Developer/Library/Frameworks
        ln -s ../../../../../Library/Frameworks/XCTest.framework
        

        【讨论】:

        • 这样做的缺点是如果您与其他人共享您的项目,因为您必须让他们执行此操作,每次有 Xcode 更新。这是 Cocoapods 实现的一个问题,因此使用 Cocoapods 解决它是有意义的!
        • 同意。这并不完美。但这真的很容易,并且可以根据您拥有的 pod 数量 (O(1)) 很好地扩展。 Xcode 6 版本的数量也最好限制一下:-)
        • 将路径添加到框架搜索路径似乎并没有减少它:测试将构建,但不会运行。显然是由于测试包无法解析 XCTest 框架。
        【解决方案10】:

        在一个没有 Cocoapods 的项目上(所以不直接回答 OP 的问题,但将来可能对我或其他人有帮助),我们遇到了同样的问题。通过用 XCTest 替换我们之前的 OCTest 项目解决了这个问题。例如,文件 MyApp.xcodeproj/project.pbxproj 有这个差异(缩短); - path = MyAppUnitTests.octest; sourceTree = BUILT_PRODUCTS_DIR; }; + path = MyAppUnitTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-02-04
          • 2014-05-08
          • 2019-04-12
          • 2021-05-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-01-13
          相关资源
          最近更新 更多