【问题标题】:Which compiler settings are changed when I change target device?更改目标设备时会更改哪些编译器设置?
【发布时间】:2016-10-25 17:18:24
【问题描述】:

我有一个 iOS 项目可以很好地为模拟器构建,但在为通用设备构建或尝试通过 Xcode 在真实设备上运行时出现编译器错误。注意:实际的编译器错误,而不是链接器或部署错误。这些错误与 typedef 中的不匹配类型有关 - 好像它包含来自不同 SDK 的标头,或者具有不同的预处理器定义。

我的问题是 - 当我在 Xcode UI 中更改目标设备时会更改哪些编译器设置,我在哪里可以查看差异?当我查看项目设置并更改目标设备时,我看不到任何差异 - 特别是部署目标版本和 SDK 版本似乎没有变化。

该项目用于在 Xcode 7 下使用任何这些目标设备构建良好,但在 Xcode 8 下则不行。我怀疑这取决于 Xcode 附带的 SDK 版本。但要使其与某些目标设备而不是其他目标设备一起工作,它必须更改编译器设置。这应该很容易解决,只要我能看到它正在做出什么改变!

这是编译失败的行(在我的代码中):

typedef     void*           IOSurfaceRef;

这是错误信息:

error: typedef redefinition with different types ('void *' vs 'struct __IOSurface *')

请注意,我不希望帮助解决错误或提供有关它尝试做什么的建议 - 我知道这不好我只想知道通过切换目标设备更改了哪些编译器设置。

【问题讨论】:

  • 使用与错误相关的实际相关代码更新您的问题,并发布完整、准确、实际的错误。
  • 谢谢,这是一个合理的要求。但是,我不想帮助修复错误 - 我在询问通过更改目标设备更改了哪些编译器设置,并且担心发布代码会引发关于代码为何执行 $HIGHLY_QUESTIONABLE_THING... 的问题
  • 这是您的 typedef 还是在某些 Apple/3rd 方代码中?
  • 它在我的代码中,它故意尝试(现在失败,对于某些但不是所有的目标设备)假装是 Apple 的 IOSurfaceRef 的别名。我不会试图为它辩护;)

标签: ios xcode


【解决方案1】:

失败是因为CGBase.h 包含此代码:

#if !TARGET_IPHONE_SIMULATOR

typedef struct  CF_BRIDGED_TYPE(id) __IOSurface *IOSurfaceRef __attribute__((swift_name("IOSurfaceRef")));

#endif

当您为设备构建时,#if !TARGET_IPHONE_SIMULATOR 预处理器指令为 true,因此您的代码有两个 typedefs 用于具有冲突类型的 IOSurfaceRef

【讨论】:

  • 谢谢。 Xcode 7 附带的 iOS SDK 中的 CGBase.h 似乎没有 IOSurfaceRef 声明,因此它之前可以工作。
  • 所以我的问题的答案是“更改目标设备时,预处理器指令(例如 TARGET_IPHONE_SIMULATOR)会更改”
猜你喜欢
  • 2016-10-14
  • 1970-01-01
  • 2015-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-08
  • 1970-01-01
相关资源
最近更新 更多