在最新的 iOS SDK 中,Apple 提供了三种编译器选项:GCC、LLVM with Clang 和 LLVM-GCC。我或多或少明白这3个是什么意思,LLVM和Clang是什么,等等。我不知道这对于 iPhone 开发者来说实际上意味着什么。截至 2011 年 1 月,我现在应该使用其中哪一个? LLVM 是否足够成熟,我可以安全地使用它,而不会经常遇到其中的错误?切换到 LLVM 还有其他缺点吗?如果确实如此,那么速度优势是否超过了它们?除了速度之外还有其他原因要切换吗?
更新:因为人们仍在寻找这个答案,我觉得我应该提供一个合适的更新。到目前为止,我希望大家清楚 Clang 绝对是编程的最佳选择,Clang 是新版本 Xcode 中的默认编译器,并支持 ARC 以及新的和即将推出的语言结构(数组和字典下标、文字等) 。几乎绝对没有理由再使用 GCC 进行编译,并且对于使用 ARC 和新功能的代码库,使用普通 GCC 不再相关或不可能(LLVM-GCC 可能支持这些功能,但它与 Clang 相比没有任何优势,因为 Clang 完全是稳定)。
到目前为止(Xcode 4.0 beta 中包含了 LLVM-2.0),LLVM 已经足够成熟,可以用于生产代码。它的编译速度比 GCC 快一点,生成的代码也更快,因此只要有可能就使用它(基本上,如果有更好的东西可用,请尽量避免使用 GCC)。标准 Xcode 3.2.5 安装包含 LLVM-1.6(不是最新的),因此我建议运行一些速度测试以查看 GCC 和 LLVM 之间是否存在明显差异,或者从源代码编译 Clang 并获取最新版本。
本质上已经不需要GCC了,LLVM + Clang 就足够了。
好吧,我认为下面的答案都没有讲述整个故事,所以这是我对我的问题的回答:
LLVM 编译代码的速度比 GCC 更快,可以创建运行速度更快的代码,并且 Clang 前端提供比 GCC 更准确的错误消息 – 所以肯定有切换的理由;
也就是说,最新稳定的 Xcode (LLVM 1.6) 提供的版本还不是 100% 稳定,如果你运气不好,你可能会遇到一些小错误。因此,如果你想安全,你应该要么从源代码编译最新的 LLVM (2.0),要么在接下来的几个月里坚持使用 GCC;
几个月后,可能当 Apple 发布 Xcode 4 时,LLVM 2.0 将成为 Xcode 默认附带的版本,然后我们都应该能够安全地切换到它。
感谢所有回复的人,如果我有错误,请随时纠正我。
我有一个应用程序,当使用 LLVM 2.0 编译时,在运行 iOS 3.1.3 的原始 iPhone 上启动时似乎会崩溃,但使用 LLVM-GCC 运行得很好。我支持回 iOS 3.1 所以这是致命的。不确定 LLVM 2.0 和我拥有的某些特定代码之间是否存在交互,但如果您需要支持 iOS 3.x,似乎最好避免使用 LLVM,除非您可以在旧设备上进行彻底测试。
更新:看来问题出在设备硬件而不是iOS版本上。第一代和第二代 iOS 设备似乎受到影响:原始 iPhone、iPhone 3G 以及第一代和第二代 iPod Touch。 我相信这意味着它仅限于 ARMv6 架构。
此外,通过 Xcode 的调试器运行调试版本可以正常工作,而通过 iTunes 安装的发布版本则不行。 所以这可能是 CPU 架构和优化级别与 LLVM 2.0 之间的相互作用。
但无论如何,暂时避免;)
切换到 Clang 的另一个主要原因是更准确(列号和行号范围)和可读的错误消息。
在最新的 WWDC10 期间,他们特别鼓励开发人员使用更新的 LLVM 编译器。我忘记了他们详细介绍它的确切内容 - “Xcode 中的新内容”之一。基本上他们建议尽可能使用 LLVM-2.0,否则使用 LLVM-GCC 并完全避免单独使用 GCC。
如果您是注册的 iOS 开发者,您可以在以下位置免费观看大部分会议: http://developer.apple.com/videos/wwdc/2010/