【摘录】在Windows*台上使用Objective-C

  虽然到目前为止最好的Objective-C 编码*台来自苹果公司,但它们绝不仅适用于苹果公司的*台。Objective-C 在Linux、BSD 甚至Windows 等其他*台都有相当久远的历史。根据具体需求,你会发现一些能很好地支持这些替代*台的开源社区。本章将简要介绍一些其他的*台,并告诉你在哪里可以找到更多关于它们的信息。

  在其他*台上使用Objective-C 时面临的最大的挑战在于对能使Objective-C 变得强大的框架的支持。移植Objective-C 语言是一件琐碎的事。由于GNU编译器集合(gcc)开始支持Objective-C,Objective-C 在几乎所有gcc 支持的*台都可用。但是,移植核心框架是一项更加艰巨的任务。

  可以确定的是,Foundation 框架已经有最广泛的跨*台支持。而 Cocoa 和一些高层框架通常在其他*台上就不可用了。也有例外情况,如果你要在OS X 之外的*台运行应用,在考虑使用GUI 框架时就要特别小心。

  对Objective-C和Cocoa所框架一起使用支持最好的主要有GNUstep 和Cocotron。这两个开源项目在移植性技术方面使用完全不同的方法,不过结果是一样的,即支持在Linux、Windows、BSD 和其他*台编写和编译使用Cocoa 和Foundation 的Objective-C 代码。

  GNUstep 

  因为其久远的历史,GNUstep 项目对Foundation 和Cocoa 有一些最好的支持。不过,因为它们的真正的目标是复制NeXTstep 环境,而不是模拟运行应用的Mac OS X 或*台的原生组件集,而它们实际上包含了整个NeXTstep 环境的组件集。这意味着如果你择通过该项目将应用移植到Windows,你的应用在Windows 上运行时,看起来像一个NeXTstep 应用。这包括所使用的菜单类型的方方面面。此外,还有一些和运行GNUstep 应用所需的文件系统相关的问题。最后要确认的一点,为了在Windows 上运行一个GNUste程序,你必须安装完整的GNUstep 文件系统以及众多支持库。这一切可以让一个普通用户困惑。出于完整性考虑,在这里需要提到的是,过去几年间为GNUstep 添加皮肤支持做了一些努力。这样你至少可以创建一个Windows 应用,并使用Windows

的组件集。换言之,GNUstep 致力于图形应用的可移植性,并不断改善,但是目前还说不上完美。总之,对于Foundation 框架,GNUstep 的项目有一些到处可用的最好、最全面的支持。我想说如果你的应用是一个命令行应用,比如服务器,并且打算移植到Windows 或Linux,那么GNUstep项目将很可能可以帮助你实现这些。可以说,利用Mac OS X 上已经写好的现成代码并移植到Windows 的一个较好的方式就是利用Objective-C 和 GNUstep 移植后台、底层非界面的代码。你可写一个原生的图形应用,通过进程间通信进行通信或者将它作为库来链接。这样做可以两全其美。一方面统一了业务逻辑代码,同时还能向用户提供熟悉的原生用户界面。关于 GNUstep 项目的更多信息,可以访问它们的站点http://www.gnustep.org。

  Cocotron

  另一个最*的跨*台Objective-C 方面的尝试就是Cocotron 项目的创建。在将应用移植到MacOS X 之外的*台方面,Cocotron 项目采用不同的方式。Cocotron 为Xcode 提供了一个的交叉编译器环境,这样你可以在Mac OS X *台上Xcode 里交叉编译你的应用。通过该交叉编译器,你可以编译Windows、Linux 或其他UNIX 桌面版本。以这种方式交叉编译的应用,观感和行为都和原生的应用一致。Cocotron 的工作原理就是利用Xcode 在编译代码时支持多个工具链和SDK的能力。为iPhoneOS 或者 Mac OS X 编译代码时,只需要单击一个按钮的技术使得Cocotron 可以发挥它的威力。如果你觉得将Mac OS X 和Xcode 作为开发环境最惬意,那Cocotron 是一个完美的解决方案。它支持在Mac OS X 上进行所有开发,然后简单地改变SDK 并为目标*台重新编译应用。这似乎还不够,Cocotron 还有一些对Cocoa 和Foundation 框架的最好的第三方支持。它的实现已足以开发同时部署在Mac OS X 和Windows *台上的Cocotron 商业级应用。Cocotron 相对落后的最大领域在网络、线程处理和一些高层次的框架支持。不过正在积极努力中,而且如果你有足够的预算,你甚至可以和Cocotron 的维护者订立契约来改善你的应用所需要的具体的库。