【问题标题】:Xcode 8 doesn't seem to be honoring my target platform when buildingXcode 8 在构建时似乎没有尊重我的目标平台
【发布时间】:2016-09-13 00:26:18
【问题描述】:

我不知道这是我的配置问题(可能)还是 Xcode 8 的错误(也可能)。

我正在将一个 iOS 框架 HLSpriteKit 移植到 Mac 上。因为项目中有几个特定于 iOS 的文件,而现在一个特定于 Mac,所以我选择创建两个单独的目标,一个用于 iOS,一个用于 macOS。

对于共享代码,我想使用 #if TARGET_OS_OSX 来定位 macOS 并使用 #else 来定位其他所有代码:

当我尝试使用我的 iOS 目标构建它时,效果很好。但是当我尝试使用 Mac 目标构建时(如您在屏幕截图的左上角所见),它失败了。即使我正在为 Mac 构建,它似乎也没有通过 #if TARGET_OS_OSX 检查。更好的是,当我 cmd-click TARGET_OS_OSX 时,它会将我带到带有 #define TARGET_OS_OSX 1 行的 macOS 10.12 TargetConditionals.h 文件。那么为什么会失败呢?

我的问题:

  1. Xcode 在编译时选择哪个 TargetConditionals.h 文件(即:iOS 或 macOS)?我假设它完全基于我在方案/设备选择器中选择的设备,可用设备列表基于给定目标的 Build Settings -> Supported Platforms。对吧?

  2. Xcode 构建我的项目是否与文本编辑器自动完成(即:cmd-click 支持)不同让我相信?

  3. 我应该换一种方式吗?

【问题讨论】:

    标签: ios objective-c xcode macos xcode8


    【解决方案1】:

    它不起作用,因为 TARGET_OS_OSX 也是为 iOS 定义的。

    尝试用户定义的宏或使用以下。

    #if TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR
       // iOS code here
    #else
       // OS X code here
    #endif
    

    【讨论】:

    • 它是定义的,但我没有使用#ifdef。我正在使用#if 来评估它的真假。此外,您可能会想到 TARGET_OS_MAC,它在 Mac 和 iOS 上都已定义且为 TRUE,但 TARGET_OS_OSX 不同。
    • 抱歉,我在 TARGET_OS_* 上看错了。您不想使用 TARGET_OS_IPHONE 的任何原因 || TARGET_IPHONE_SIMULATOR ?
    • 至少在我的情况下,iPhone、AppleTV、Apple watch 和相应的模拟器都使用相同的代码。 Mac是唯一的区别。但除此之外,它仍然不能解决问题,因为问题不在于我选择了哪个常量——而是选择了哪个头文件来定义这些常量。
    • 另外,不要忘记#include // Xcode 8+ 中需要
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-18
    • 1970-01-01
    • 1970-01-01
    • 2017-08-18
    • 2019-07-12
    • 1970-01-01
    • 2019-09-15
    相关资源
    最近更新 更多