2008-10-31 115 views
30

我想构建一个可在Windows和Mac OS X上运行的应用程序。我也愿意利用其运行的平台所提供的最佳平台关于框架,API等等。有没有办法做到这一点,而不必编写Objective-C代码,然后编写C#代码?我一直在想C++作为替代方案,但我想知道是否还有其他东西。该应用程序将基于GUI(虽然我不知道它会做什么)创建一个跨平台的Windows,Mac OS X应用程序

-G。

回答

49

你很早就想到了可移植性 - 在事实发生之后“很难将其”绑定“。

有各种各样的跨平台套件可用,但恕我直言,所有这些都缺乏提供所有支持的平台上的“本机”的外观和感觉。在Mac上(我使用的),这类工具包的支持者总是想提及他们正在使用本机控件。这是一个好的开始,但这不是整个旅程。通过Apple's Human Interface Guidelines解决的其他问题包括控制应该如何安排,按钮标签应该如何表述,应该用什么标准快捷键等

即使微软不得不learn the hard way约的尝试写一个跨平台的危险图形用户界面,用于Mac的命运多Word的Word 6.0。恕我直言,更好的方法是使用MVC设计,模型层用标准,可移植的C++编写,视图层和控制器层使用本地工具包用于每个平台。对于Mac版本,Carbon和C++始终都是一个有趣的选项,现在不再支持,因此您希望使用Cocoa,在视图中使用Objective-C,在控制器中使用Objective-C++来弥补语言差距。您的Windows版本可能同样将您的模型编译为“托管C++”,并将任何.NET语言用于控制器和视图。

3

对于GUI,我会考虑SDL或QT。

而且,只要检查出单http://mono-project.com/Main_Page

+2

SDL是一款优秀的游戏解决方案 - 但对于GUI应用程序来说呢?真的吗? – 2008-10-31 04:09:32

+1

Qt的+1。不知道关于SDL。 – jop 2008-10-31 04:58:13

0

,你是不依赖于语言,它看起来像Java是一个不错的人选。将它和SWT结合起来,你就可以在任何你喜欢的操作系统上安装一个本地的应用程序。

+0

除了Java程序在Mac上臭名昭着的“坏”。文件对话框不能按预期工作,并且一切都感觉错误。 (我用Java开发,至少在某些时候!) – 2008-10-31 04:54:02

+0

即使使用SWT?鉴于在Mac上运行Eclipse的开发人员的数量,这对我来说似乎很奇怪。 – 2008-10-31 14:24:47

+0

>>文件对话框不能正常工作 这很容易解决,只需使用java.awt.FileDialog而不是javax.swing.JFileChooser – 2009-09-03 12:06:20

16

看看Real Studio。认真。您可以在Real Studio中编写应用程序,并将其部署在Windows,Mac OS X和Linux上。

编辑:Real Studio现在是Xojo

+2

对我来说,这是唯一真正的选项,以所有3个为目标几年。 – bruceatk 2008-11-02 23:26:55

+0

我不知道有一个OO,更新版本的BASIC。整齐! – EndangeredMassa 2008-12-21 01:12:36

2

如果您是Windows开发人员,请使用Qt或C#Winforms;如果你是Mac开发者,你可以尝试Cocotron(http://www.cocotron.org/),但它还没有完成,尽管商业应用程序已经与它一起出货。

6

wxWidgets是一个跨平台的C++库,这是一个实用的选择。但是我同意Sherm--所有的跨平台库都会为本地应用程序创建一个劣质的UI。

由于每个操作系统具有不同的UI语义(按钮顺序等),使得它变得更加困难,所以虽然您可以获得好看,但通过一个视图层获得每个平台上的“感觉”几乎是不可能的。

根据您最终做了什么,您可能会发现更好的Web界面(例如,将Web服务器嵌入到您的应用中,并将HTTP页面提供给浏览器)。您避免了L & F问题!或者,你可以决定你只是有一个完全非标准的L & F,并且可以使用wxWidgets或Tcl/Tk。

0

我打算做类似的事情,我正在考虑创建一个C#/。NET Windows应用程序,然后使用Mono将它移植到OS X.我的应用程序已经有一个完整的(除了标题栏和转角按钮)自定义绘制的用户界面,所以美化操作系统差异不应该太多影响我。

我不确定在框架和API等方面充分利用每个平台的优势,意味着什么。一般来说,编写一个跨平台的应用程序意味着写一个最小公分母,这意味着而不是从每个平台中获得最大利益。

3

如果您决定使用C++,那么会有许多优秀的跨平台GUI库,这将允许您避免为每个平台重复使用GUI代码。例如:

还有一些其他类似的项目,但这些都是一些更好,更知名的人的。对于代码的其余部分,当然必须使用单独的C++代码编写任何系统特定的代码,以便在必要时与Win32 API或OS X的系统API进行交互。这就是说,你可能会发现你可以通过使用像Boost这样的扩展库来避免许多系统特定的代码。

其他建议可能是使用配置文件而不是Windows注册表或Mac上的plist文件。相反,尽可能拍摄平台不可知的方法,尽量减少使用系统API编写代码的地方。

3

您应该使用适用于每个操作系统的最佳工具。

C/C++代码可以从GUI中分离出来并用于每个单独开发的程序。

在您做出决定之前,请查看使用可移植工具包(例如Qt或wxWidgets)开发的跨平台应用程序。根据我的经验,他们从来没有像他们的本地对手那样精致,尤其是在Mac上。

4

带有AIR库的Adobe Flex为您提供了一个单一的高级开发环境。我已经编写了几个实用程序,供人们在两个平台上交替使用。

如果您感兴趣的话,您也可以通过浏览器获得合理的可移植性。但我认为这是一个很好的解决方案,不考虑这个好处。

0

Java或Mono出现在我的脑海。有些人可能会争辩说,Java图形工具包并不是最简单的,但它似乎至少对我来说是将应用程序移植到多个平台并避免部署困难的最简单方法。

另一方面,单声道可能有点难以移植,因为如果您打算拥有原生的小部件(winforms或GTK for Windows和CocoaSharp for Max),您至少必须编写gui两次,但你可以只写一次后端,为每个平台开发一个前端。

正如我所说的,Java GUI工具包可能不会在OSX内部或Windows上感觉到“本机”,但它们确实可以在两种平台上工作,您可以使用Swing或AWT。

至于单声道,你可以使用GTK或Winforms的Windows和OSX,但他们仍然不会觉得本机,但可以,但是,使用CocoaSharp绑定到Cocoa框架,但我不知道项目的状态(阅读:功能支持)

0

我第二个Java。它被设计成一个跨平台的解决方案。

其他人提到Adobe Air。

与Adobe Air类似,Silverlight是Silverlight。我相信它是(或将会)完全跨平台。

1

还检查了fltk,wxWidgets的非常好&丰富,但也非常大......

1

正如其他人所说的,绝对是婆可以在Windows和Mac上用Java创建出色的跨平台GUI。但是,如果您希望自己的应用融入并采取行动,使其“感觉”像是从底层开始为其运行的平台设计的应用,则您必须为每个版本的应用开发GUI和用户体验应用程序分开。

如果您分析您的应用程序将要执行的操作,并确定可以在平台之间共享的代码/逻辑的重要部分,然后使用两种系统上可用的语言以便携方式编写该部分。 C,C++,Java,Python,Ruby等。如果没有重要的部分,即大多数代码将用于GUI,则根本不需要共享任何代码。

如果有相当部分的通用代码,我会建议将Python和Ruby视为实现语言,因为在Mac和Windows上使用IronPython和IronRuby时,可用于Cocoa绑定的语言也可以在.Net应用程序中使用该代码。

0

在磁Studios的家伙有一个不错的write up on using Cocotron建立一个Windows可执行文件和Xcode。

我对Cocotron没有经验,但是如果我需要编写一个Windows应用程序 - 带有Mac开发背景 - 这将是我第一次尝试。

2

感谢您的所有答案。我一直在做一些研究,并与WPF和CAn​​imation等玩耍。它看起来像使用C/C++模型,并为每个平台单独做GUI是最好的方法。感谢你的帮助。

4

我的建议,使用Python。 Python与Ob​​jective-C和C#(IronPython)集成。只要避免使用该语言的许多全新的出血边缘功能,即可。

当然,这不会是无忧无虑的简单。但我认为,不应该无意识地容易。当设计人员将其应用程序移植到其他平台时,他们的应用程序将如何工作,这一点变得非常明显。

0

如果您选择C++语言,那么我肯定会推荐Qt。您的应用程序可以根据OP中的要求在Windows和Mac下部署,也可以在Linux上部署,并且现在可以使用智能手机上的最新版本使用iOs,Windows RT和Android。

这是有据可查,并在网络上非常活跃(包括SO)。

我看到的唯一不足就是Qt的创造者工具,恕我直言,它不像历史工具(比如Visual Studio)那么友好,但实际上你并没有被迫将它用作Qt开发的IDE。

0

为了完整性,现在值得将Unity添加到列表中。

要为任一平台创建一个原生外观的应用程序是非常困难的,而且一般的GUI工具还远未成熟。但是,它不仅仅是一个游戏引擎,你可以用C#/ Mono编写,使用一系列体面的库,并且可以毫不费力地部署到Win和OSX上。