【问题标题】:Easiest way to build a cross-platform application构建跨平台应用程序的最简单方法
【发布时间】:2011-06-14 09:33:39
【问题描述】:

看了几篇跨平台标签的文章。然而,当我开始一个新的应用程序(主要是一个终端/控制台应用程序)时,我想知道让它跨平台的最简单方法(即适用于 Linux、Mac OS X 和 Windows)。我想到了以下几点:

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

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

编辑:听起来对 Java 和 Qt 有很多流行的反应。我们在这两者之间的权衡是什么?

【问题讨论】:

    标签: c++ cross-platform


    【解决方案1】:

    不要走第一条路。您会遇到很多问题,这些问题已经被众多工具解决了。

    如果你确实想要 C++,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++ 可能是更好的选择。

    【讨论】:

    • 哦,天哪……您的回答几乎总结了我在做出决定时需要考虑的不同权衡。几年前我尝试过 Qt 并放弃了它(肯定很烂)。在最坏的情况下,我可以尝试请朋友辅导我。
    • @stanigator,我建议阅读 Qt 文档的介绍性部分。一旦您让构建系统工作并找出信号和插槽等主要技术,Qt 就会变得易于使用并且创造奇迹。
    • dom4j 比 Qt 更容易在 XML 中编辑/添加值,并且最适合。我从未在 Qt 中完成过 XML 工作(编码问题)。在 dom4j 的 Java 中,它可以完美运行。 Qt 项目的编译应该在 Qt 的每个平台上单独进行,但是如果您想在特定平台上修复错误,这可能会很痛苦。用于商业应用的 Qt 需要巨额资金用于静态库或商业用途。在 Java 上,您可以按照自己的方式和许可开发应用程序。为了安全和引发错误,我见过 wxwigets 应用程序可以无缘无故地关闭应用程序。 Java 工作正常。
    • 但是qt是付费的,不是吗?我看到每月价格高达 300 美元:/
    • @lxx,以前是付费的,后来和 GPL 双重化意味着你可以免费将它用于 GPL 软件,现在它与 LGPL 双重化意味着如果你遵守 LGPL,你可以使用即使对于商业应用程序也是免费的。只有在需要支持和/或无法遵守 LGPL 时才需要付费。
    【解决方案2】:

    我还建议使用 Github 的 electron,它允许使用 NodeJs 和 Google 的 Chromium 构建跨平台桌面应用程序。这种方法的唯一缺点是,由于 Javascript 和原生 C++ 之间的抽象层,电子应用程序的运行速度比原生 C++ 应用程序慢得多。

    【讨论】:

      【解决方案3】:

      我想说,如果你真的想使用 C++,QT 是跨平台应用程序的最简单方法,我发现自己在需要 UI 时使用 QT,即使 QT 有大量的库可以制作几乎所有东西在 C++ 中更容易。

      如果你不想使用 QT,那么你需要一个好的设计和大量的抽象来制作跨平台的应用程序。

      但是,对于中等规模的应用程序,我使用越来越多的 Python bindinq 到 QT。 如果您正在开发控制台应用程序并且您了解一点 Python,您可能会发现 Python 脚本比 C++ 更舒适。它可以节省时间消耗的东西,以便能够专注于您的应用程序。

      【讨论】:

        【解决方案4】:

        使用 Java。尽可能多的抨击它得到/习惯得到,这是让东西在任何平台上工作的最好的事情。当然,您仍然需要处理您可能正在使用的与操作系统相关的外部功能,但这比使用其他任何功能要好得多。

        除了 Java,您还可以在 JVM 上运行一些东西——想到 JRuby、Jython、Scala。

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

        C/C++ 最适合需要完全内存控制和高度可控性的应用程序。

        【讨论】:

        • 是的!在我看来,大多数东西实际上应该用 Java 编程,它很简单,它足够可靠和灵活。唯一的例外是游戏引擎等高性能实时应用程序。
        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

          我会选择 QT(或其他一些框架)选项。如果您选择第一个,您会发现它要困难得多。毕竟,您必须知道在针对您所针对的所有平台的各种条件编译部分中添加什么内容。

          【讨论】:

            【解决方案7】:

            我建议使用专为跨平台应用程序开发而设计的技术。以下是我所知道的两种技术——只要你阅读文档并正确使用这些特性——你就可以构建应用程序以在所有 3 个平台上运行:

            当然,网络总是存在的。我主要使用 Web 应用程序不仅是因为它们的便携性,还因为它们可以在我的 Windows PC、Ubuntu 计算机和 Mac 上运行。

            我们主要构建网络应用程序,因为网络就是未来。在我的组织中,本地应用程序被认为大多已过时,除非网络尚不支持的某些功能或技术会阻止该应用程序完全基于网络。

            【讨论】:

            • 实际上,这个答案的网络部分很棒。如果你可以在浏览器上运行某些东西,那就去做吧。它是迄今为止任何用户端应用程序的最佳部署平台。
            • @jetru - 同意!并且认为我原本不打算在之前添加那个。用户需要便携性,但他们也需要在桌面上为他们提供的功能。与 3 年前相比,网络能够做的事情要多得多。想想再过3年它会做什么!另外,我真的没有Mac。我只是为了强调,如果我确实有一台 Mac,我将能够运行我的所有程序 :)
            猜你喜欢
            • 2011-06-08
            • 1970-01-01
            • 1970-01-01
            • 2018-03-07
            • 1970-01-01
            • 1970-01-01
            • 2013-06-03
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多