构建跨平台应用的最简单方法

22

我读了一些跨平台的标签文章,但是由于我正在开发一个全新的应用程序(主要是终端/控制台应用程序),我想知道实现跨平台最简单的方法是什么(即适用于Linux、Mac OS X和Windows)。我考虑了以下几点:

  • 在代码中添加各种宏/标记,为每个操作系统构建不同的二进制可执行文件
  • 使用Qt平台开发跨功能应用程序(尽管GUI和平台组件会增加更多的开发时间,因为我不熟悉Qt)

你有什么想法?感谢您提前的贡献!

编辑:听起来Java和Qt有很多流行的响应。在我们讨论这两个工具之间的权衡时,有什么建议吗?

8个回答

20

不要采用第一种方式。你会遇到许多已经被许多工具解决的问题。

如果你绝对需要C ++,那么Qt是一个很好的选择。事实上,即使你不熟悉它,Qt也会加速开发,因为它有出色的文档并且易于使用。其中好处是它不仅仅是一个GUI框架,而且还包括网络、XML、I/O以及你可能需要的很多其他功能。

如果不一定需要C++,我会选择Java。对于大多数应用程序来说,C++是过于底层的语言。调试内存管理和堆栈错误可能非常困难。

针对您修改后的问题:

  • 显然的一点:Java有垃圾收集,C++没有。这意味着在Java中没有内存泄漏(除非您考虑JVM中可能存在的错误),也无需担心悬挂指针等问题。
  • 另一个明显的问题:使用#ifdefs在C ++中非常容易使用平台相关代码。在Java中,这真的很麻烦。虽然有JNI,但使用起来并不容易。
  • Java对异常有很广泛的支持。虽然C++也有异常,但Qt不使用它们,而在Java中生成异常的一些事情将在C ++中导致内存错误和崩溃(考虑缓冲区溢出)。
  • “一次编写,到处运行”。重新编译许多平台的C++程序可能令人生畏。Java程序不需要重新编译。
  • 这个问题还存在辩论,但我认为Java有更广泛和明确定义的库。抽象级别通常更高,接口更清洁。它还支持更多有用的东西,例如XML模式等。我想不到一个在Qt中存在却在Java中不存在的功能。也许是多媒体之类的东西,我不确定。
  • 现在,这两种语言都非常快,因此性能通常不是问题,但Java可能会占用大量内存。在现代硬件上不是非常重要,但仍然需要注意。
  • 最不显然的一个是:C++比Java更具可移植性。一个例子是FreeBSD操作系统,一段时间以前它对Java支持非常差(现在不知道是否仍然如此)。而C++/Qt在其中表现得非常好。如果您计划支持广泛的Unix系统,则C++可能是更好的选择。

  • 1
    哦,我的天啊...你的回答基本上总结了我在做决定时需要考虑的不同权衡。几年前我尝试过Qt,但最终放弃了(肯定是太菜了)。如果万不得已,我可以试着找个朋友来辅导我。 - stanigator
    @stanigator,我建议阅读Qt文档的介绍部分。一旦您使构建系统正常工作并了解了主要技术,例如信号和槽,Qt将变得容易使用,并且会有神奇的效果。 - Sergei Tachenov
    dom4j很容易且最适合在XML中编辑/添加值,比Qt更好。我从未在Qt中处理过XML(编码问题)。在Java中使用dom4j可以完美地解决这个问题。为Qt项目编译应该在每个平台上单独进行,但如果您想在特定平台上修复错误,则可能会遇到问题。对于商业应用程序的Qt,需要大量资金用于静态库或商业使用。在Java中,您可以按自己的方式开发应用程序并获得许可。关于安全性和抛出错误,我见过wxwigets应用程序无缘无故地关闭应用程序。Java运行良好。 - Marin Sagovac
    2
    但是 QT 是付费的,对吧?我看到月费高达 300 美元 :/ - User
    1
    @lxx,它曾经是付费的,然后转为双重授权GPL,这意味着您可以免费使用它来开发GPL软件,现在它是双重授权LGPL,这意味着如果您遵守LGPL,即使是商业应用程序,也可以免费使用。只有当您需要支持和/或无法遵守LGPL时才需要付费。 - Sergei Tachenov

    6

    使用Java。尽管曾经受到过很多批评,但它是在任何平台上让东西正常运行的最好选择。当然,你仍然需要处理外部操作系统相关的功能,但它比使用其他任何东西要好得多。

    除了Java,还有一些可以在JVM上运行的东西,如JRuby、Jython和Scala。

    你也可以直接使用脚本语言(如Ruby、Python等)编写。

    C/C++最好留给需要完全内存控制和高可控性的应用程序。


    是的!在我看来,大多数东西实际上都应该用Java编程,它易于使用,可靠且足够灵活。唯一的例外是高性能、实时应用程序,比如游戏引擎。 - RecursiveExceptionException

    4

    我建议选择QT(或其他框架)选项。如果你选择第一个选项,你会发现它要困难得多。毕竟,你必须知道要将什么放入所有目标平台的有条件编译的各个部分中。


    3
    我建议您使用Github的Electron,它可以使用NodeJs和Google的Chromium构建跨平台桌面应用程序。但是,缺点是由于JavaScript与本地C ++之间的抽象层之间,Electron应用程序的运行速度比本地C ++应用程序慢得多。

    3
    我建议使用专为跨平台应用程序开发而设计的技术。以下是我知道的两种技术,只要您阅读文档并正确使用功能,就可以构建可在所有三个平台上运行的应用程序: 当然,还有网络。我主要使用网络应用程序不仅因为它们的可移植性,而且因为它们可以在我的Windows PC、Ubuntu计算机和Mac上运行。
    我们主要构建Web应用程序,因为Web是未来。除非当然有一些Web尚不支持的特定功能或技术,否则本组织将本地应用程序视为大多已过时。

    实际上,这个答案中的Web部分非常好。如果你可以在浏览器上运行某些东西,那就去做吧。这是迄今为止任何用户端应用程序的最佳部署平台。 - jetru
    @jetru - 同意!想想我最初并不打算添加那个功能。用户要求可移植性,但他们也要求桌面端所提供的强大功能。网络能够做的事情比仅仅3年前多得多。想象一下再过3年它将会做到什么程度!另外,我实际上没有Mac电脑。我只是为了强调,如果我有一台Mac电脑,我就能运行所有的程序 :) - jamesmortensen

    2
    如果您正在制作控制台应用程序,如果您坚持使用POSIX库中定义的函数,则应该能够在所有三个平台上使用相同的源代码。 设置构建环境是最复杂的部分,特别是如果您想要能够从相同的源树构建多个平台的应用程序。

    2

    我认为,如果您真的想使用C++开发跨平台应用程序,QT是最简单的方法。即使QT具有大量库可以使C++编程变得更加容易,但我发现自己在需要用户界面时仍然会使用QT。

    如果您不想使用QT,则需要良好的设计和大量抽象来制作跨平台应用程序。

    然而,对于中等规模的应用程序,我越来越多地使用Python绑定到QT上。如果您正在开发控制台应用程序并且了解一些Python知识,您可能会发现Python脚本比C++更加舒适。它可以将耗时的部分隔离出来,使您能够专注于应用程序的开发。


    0
    我很惊讶没有人提到使用FireMonkey (FMX) GUI FrameworkC++ Builder IDE
    使用C++ Builder和FMX,您可以非常轻松地创建适用于Windows、MacOS、Linux、iOS和Android的跨平台应用程序。
    我百分之百推荐尝试一下C++ Builder。

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接