我有一个适用于模拟器的 iOS 项目,但在为通用设备构建时或当我尝试通过 Xcode 在真实设备上运行时出现编译器错误。注意:实际的编译器错误,而不是链接器或部署错误。这些错误与 typedef 中的不匹配类型有关 - 就好像它包含来自不同 SDK 的 header ,或者具有不同的预处理器定义。
我的问题是 - 当我在 Xcode UI 中更改目标设备时会更改哪些编译器设置,我可以在哪里查看差异?当我查看项目设置并更改目标设备时,我看不到任何差异 - 特别是部署目标版本和 SDK 版本似乎没有变化。
该项目过去常常在 Xcode 7 下使用这些目标设备中的任何一个构建良好,但在 Xcode 8 下却不行。我怀疑这取决于 Xcode 附带的 SDK 版本。但是为了让它与某些目标设备一起工作而不是其他目标设备,它必须更改编译器设置。这应该很容易修复,如果我能看到它正在发生什么变化就好了!
这是无法编译的行(在我的代码中):
typedef void* IOSurfaceRef;
这是错误信息:
error: typedef redefinition with different types ('void *' vs 'struct __IOSurface *')
请注意,我不需要帮助修复错误或关于它正在尝试做什么的建议 - 我知道这不好。我只是想知道通过切换目标设备更改了哪些编译器设置。
最佳答案
失败是因为 CGBase.h
包含这段代码:
#if !TARGET_IPHONE_SIMULATOR
typedef struct CF_BRIDGED_TYPE(id) __IOSurface *IOSurfaceRef __attribute__((swift_name("IOSurfaceRef")));
#endif
当您为设备构建时,#if !TARGET_IPHONE_SIMULATOR
预处理器指令为 true,因此您的代码有两个 typedef
用于 IOSurfaceRef
类型冲突。
关于ios - 当我更改目标设备时,哪些编译器设置会更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40245954/