【问题标题】:C++ Cross platform librariesC++ 跨平台库
【发布时间】:2011-07-11 04:54:58
【问题描述】:

我对 C++ 并不完全陌生,但我从未设法了解库。

我想将我的网络、图形和输入类集从我的主要可执行文件中分离出来,以便我可以单独更新它们,而不是将所有代码的重新编译版本作为单个可执行文件发送出去。

这可能吗?我该如何跨平台? (例如,该过程将在 Windows、Linux 和 Mac 上运行)

【问题讨论】:

  • 这是可能的,大多数人在第一次发现它是可能的时候就会这样做,到最后它只会使构建、分发和调试过程复杂化。除非您谈论的是一个非常大的系统,并且可以很好地跟踪和处理不同的库版本,否则只需制作一个可执行文件并省去一些麻烦。
  • @Erik:取决于环境。当您发现自己在多个产品之间复制/共享代码时,可能是时候将您的共享代码拆分到一个或多个库中了。干:-)
  • @DarkDust:我发现情况正好相反,因为版本冲突令人头疼。带宽便宜。时间不是:)
  • 警告说要跨平台制作一些东西需要做大量的工作。也不要让 Mac 用户发现你称它为“Max”,他们非常感性:P
  • @AJG85,错字:P 感谢您的警告,但我非常需要。

标签: c++ cross-platform libraries


【解决方案1】:

正如@Armen 用最简单的术语所说的那样,这里的要求之一是尽可能/需要跨平台工作的库。 Qt 是显而易见的选择。还有其他类似 wxWidgets 的工具可以实现相同的功能,您可以自行选择。

第二件事是所有“可升级”的库都需要符合二进制兼容性(Qt 承诺为每个主要版本做的事情,不知道 wxWidgets)。

第三个,可能是“是的,呃!”部分:您需要将这些构建为共享库并链接这些共享库。

这三点应该允许您在不重建可执行文件本身的情况下替换库,并使其尽可能小。不同平台的升级方式会有所不同(linux:通过存储库自动,Mac 和 Windows 手动或通过您自己的更新软件,也许 Mac 的 macports?)

【讨论】:

  • 另外,您可以使用 Qt 插件机制来提供更小的组件,您可以在没有全新程序的情况下升级和重新分发。
  • 很难将 Qt 称为“C++ 库”,因为它不能由... erm... C++ 编译器编译。
  • @Billy:抛开所有的愚蠢不谈,如果你不喜欢 Qt 作为“C++ 库”这一点,就称它为“C++ 框架”。许多 GNU 程序和库也不能由 C 编译器编译,因为它们需要大量的辅助实用程序(一个典型的例子:GCC,它至少使用 flex 和 bison,yacc)。恕我直言,moc 要小得多,最终仍会生成纯 C++ 代码。同意,Qt 和 STL 有显着差异,但 Qt 非常模板化和面向对象以及类似 c++0x 的内存管理(参见例如 Qt 的智能指针)。
  • @rubenvb:我看不出 STL 与这次对话有什么关系。我对 Qt 的看法不是它是一个糟糕的库或框架,而是称它为 C++ 库有点牵强。没有人调用 Flex 或 Bison C 库。这并不意味着它们没有用。但是,如果有人要求 C 或 C++ 解决该问题,您应该提前说明 Qt 需要额外的预处理步骤。
  • @Billy:好吧,你说的只是moc?每个主要的构建系统都支持这些东西,它不是一个问题,而是一个特性。关于 Flex/Bison 类比:它们不是 C 库,不,但它们是构建某些项目所需的非编译器 C 东西。 Qt 的 moc 也是如此,除了任何 Qt 开发环境也内置了 moc。如果你不能理解我的观点,那么我建议我们同意不同意。
【解决方案2】:

是的,使用Qt

【讨论】:

  • 我认为 OP 希望将他们自己系统的一部分开发为一个库,该库与主程序分开编译和部署。我不确定 Qt 会完全解决这个问题,尽管它可能有助于跨平台 UI 的东西......
  • 谢谢,但我已经有了代码。我只是想把它从可执行文件中拆分出来。
  • 很难将 Qt 称为“C++ 库”,因为它不能由... erm... C++ 编译器编译。
  • @Billy: 将 Qt 称为 C++ 库对我来说相当容易,即使它不能被任何 erm... C++ 编译器编译 :)
  • 嗯..奇怪。没有人调用 Flex 或 Bison C 库。
【解决方案3】:

我发誓的两个图书馆,你可能想看看

SDL:
http://www.libsdl.org/
啧啧:
http://lazyfoo.net/SDL_tutorials/index.php

SFML:
http://www.sfml-dev.org/
啧啧:
http://www.sfml-dev.org/tutorials/1.6/

图形/网络/音频库!

【讨论】:

    【解决方案4】:

    真的,这没有意义。无论如何,当您将二进制文件移动到另一个平台时,您都必须重新编译它,因为不同的平台使用不同的硬件并使用不同的二进制格式。没有理由不将“特定于平台”的代码链接到同一个二进制文件中。

    但是,在源代码级别的跨平台确实有意义。

    【讨论】:

    • 我认为您不明白 OP 在问什么;他显然在谈论一组源跨平台库(还有其他类型的跨平台库吗?--> 没有)能够分开分发和二进制升级。