我有一个适用于模拟器的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 *')
请注意我不想帮助修复错误或建议他们尝试做什么 - 我知道它不好。< / em>我只是想知道通过切换目标设备来改变哪些编译器设置。
答案 0 :(得分: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,因此您的代码有两个typedef
用于IOSurfaceRef
且类型冲突。