C++跨平台库

3

虽然我已经不是C++的新手了,但我始终没有掌握库的使用方法。

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

这是否可能,如何跨平台实现呢?(例如,该过程将在Windows、Linux和Mac上工作)


4
当人们第一次发现这是可能的时,大多数人都会去尝试,但最终结果只会使构建、分发和调试过程变得更加复杂。除非你在谈论一个非常大的系统,并且能够很好地跟踪和处理不同库版本,否则请只制作一个可执行文件,节省自己一些麻烦。 - Erik
2
@Erik:这要取决于环境。如果你发现自己在多个产品之间复制/共享代码,那么是时候将你的共享代码拆分为一个或多个库了。DRY :-) - DarkDust
@DarkDust:我发现相反的情况是真的,因为版本冲突带来了很多麻烦。带宽很便宜,时间却不是 :) - Erik
警告:制作跨平台应用需要大量工作。另外,不要让Mac用户听到你把它称为“Max”,他们非常有感情。 :P - AJG85
@AJG85,打错了:P 谢谢你的警告,但我非常需要它。 - James
显示剩余2条评论
4个回答

4
如@Armen所说,这里的一个要求是需要一个尽可能跨平台的库。Qt是显而易见的选择。还有其他一些像wxWidgets那样实现相同功能的库,选择权在你手中。
第二个要点是所有“可升级”的库都需要符合二进制兼容性(Qt承诺每个主要版本都会做到这一点,不知道wxWidgets是否也是如此)。
第三个也可能是最显而易见的:您需要将这些构建为共享库并链接这些共享库。
这三个要点应该允许您替换库而无需重新构建可执行文件本身,并使其尽可能小。但是,在不同的平台上升级的方式会有所不同(Linux:通过存储库自动完成,Mac和Windows则需要手动或通过自己的更新软件完成,也许对于Mac来说是macports?)。

1
此外,您可以使用Qt插件机制提供更小的组件,这些组件可以在不需要全新程序的情况下进行升级和重新分发。 - Dat Chu
很难称Qt为“C++库”,因为它不能被一个……嗯……C++编译器编译。 - Billy ONeal
@Billy:撇开所有的愚蠢,如果你不喜欢Qt作为“C++库”的方面,那就称它为“C++框架”。许多GNU程序和库也无法通过C编译器编译,因为它们需要大量的辅助工具(一个主要的例子是GCC,它至少使用flex和bison、yacc)。在我看来,moc要小得多,最终生成的是纯C++代码。当然,Qt和STL有着显著的区别,但Qt非常模板化和面向对象,并且类似于c++0x的内存管理(例如,参见Qt的智能指针)。 - rubenvb
@rubenvb:我不明白STL与这次对话有什么关系。我的观点是,Qt并不是一个糟糕的库或框架,但称其为C++库有点牵强。没有人会称Flex或Bison为C库。这并不意味着它们没有用处。但如果有人要求C或C++解决方案,你应该坦率地说明Qt需要额外的预处理步骤。 - Billy ONeal
@Billy:好的,你只是在谈论 moc 吗?每个主要的构建系统都支持这些东西,这不是问题,而是一个特性。关于 Flex/Bison 的类比:它们不是 C 库,但它们是构建某些项目所需的非编译器 C 东西。Qt 的 moc 也是如此,除了任何 Qt 开发环境都内置了 moc。如果你看不到我的观点,那么我建议我们同意不同意。 - rubenvb
如果它不能根据C ++标准进行编译,那么我不明白它如何被称为C ++。是的,Flex和Bison是非编译器C语言。Qt也是一样的。任何“Flex开发环境”都带有flex内置。这并不意味着允许某人将flex程序冒充C库。 - Billy ONeal

2
是的,使用 Qt

1
我认为OP想要将他们自己系统的部分开发为一个库,该库可以单独编译和部署,与主程序分离。虽然Qt可能有助于跨平台UI方面的问题,但我不确定它能完全解决这个问题。 - FrustratedWithFormsDesigner
谢谢,但我已经有代码了。我只想将其从可执行文件中分离出来。 - James
1
很难称Qt为“C++库”,因为它不能被一个……嗯……C++编译器编译。 - Billy ONeal
1
@Billy:对我来说,称Qt为C++库相当容易,尽管它不能被任何C++编译器编译 :) - Armen Tsirunyan
嗯..奇怪。没有人称呼Flex或Bison为C库。 - Billy ONeal

1

0

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

然而,在源级别上进行跨平台确实是有意义的。


2
我认为你没有理解OP在问什么;他显然是在谈论一组源跨平台库(还有其他类型的跨平台吗?-->没有),以便能够分割分发和二进制升级。 - rubenvb

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