对于我的iOS& OS X C ++库,数据类型unsigned long导致64位环境出现问题。它在32位架构中工作正常。在GCC中读取-mx32编译器标志,它将所有64位数据类型处理为32位。在iOS& OS X for llvm,是否存在任何此类Flags以支持32位体系结构中的unsigned long。 我试过在Compliter Flags部分添加-mx32标志,仍然将unsigned long的大小打印为8。
感谢。
答案 0 :(得分:1)
long
的大小由平台ABI定义。 Apple宣布您必须支持他们的64位ABI:
在2017年WWDC上,我们宣布提交至Mac App Store的新应用程序必须从2018年1月开始支持64位,Mac应用程序更新和现有应用程序必须从2018年6月开始支持64位。如果您在Mac之外分发应用程序App Store,我们强烈建议您分发64位二进制文件,以确保您的用户可以继续在未来版本的macOS上运行您的应用程序。 macOS High Sierra将是最后一个支持32位应用程序而不妥协的macOS版本。
提醒一下,提交给App Store的新iOS应用和更新必须支持64位。 iOS 11中不支持32位应用程序,以前安装在用户设备上的所有32位应用程序都无法启动。如果您尚未在App Store上更新您的应用以支持64位,我们建议您提交更新,以便您的用户可以继续在iOS 11上运行您的应用,这将在今年秋天掌握在数亿客户手中
这意味着回到仅32位版本将在短期内无效。理论上可以构建一个自定义编译器,它在外部具有64位ABI,但内部具有不同的类型大小。 OpenJDK在内部执行此操作,GNU工具链在x86-64上支持非常类似的东西(虽然它仍然需要内核支持,所以它不是Darwin的选项)。但这需要做很多工作,并且需要对系统头进行大量调整。
不幸的是,您最好的选择是用unsigned long
等便携式替换软件中的uint32_t
。