用 C 语言编写跨平台应用程序时最应该记住哪些事情?目标平台:基于 Intel 的 32 位 PC、Mac 和 Linux。我特别寻找 Jungle Disk 在其 USB 桌面版本中所具有的多功能性( http://www.jungledisk.com/desktop/download.aspx )

这种类型的开发有哪些技巧和“陷阱”?

有帮助吗?

解决方案

我维护了一个 ANSI C 网络库多年,该库已移植到近 30 个不同的操作系统和编译器上。该库没有任何 GUI 组件,这使得它变得更容易。我们最终将跨平台不一致的任何例程抽象到专用源文件中,并在这些源文件中适当的地方使用#defines。这使得每个平台调整的代码与库的主要业务逻辑隔离。我们还广泛使用了 typedef 和我们自己的专用类型,以便我们可以根据需要轻松地根据平台更改它们。这使得移植到 64 位平台变得相当容易。

如果您正在寻找 GUI 组件,我建议您查看 GUI 工具包,例如 WxWindows 或 Qt(它们都是 C++ 库)。

其他提示

尽量避免依赖于平台的#ifdef,因为当您添加新平台时它们往往会呈指数级增长。相反,尝试将源文件组织为树,在根处使用与平台无关的代码,在“叶子”上使用平台相关的代码。有一本关于这个主题的好书, 多平台代码管理. 。其中的示例代码可能看起来已经过时,但书中描述的想法仍然非常重要。

根据凯尔的回答,我强烈推荐 反对 尝试在 Windows 中使用 Posix 子系统。它的实施达到了绝对最低水平,因此 Microsoft 可以在功能表复选框上声明“Posix 支持”。也许有人确实使用过它,但我在现实生活中从未遇到过它。

一个人当然可以编写跨平台的C代码,你只需要意识到平台之间的差异,并且测试,测试,测试。单元测试和 CI(持续集成)解决方案将大大有助于确保您的程序在所有目标平台上运行。

一种好的方法是将系统相关的内容最多隔离在一个或几个模块中。从该模块提供独立于系统的接口。然后在该模块之上构建其他所有内容,因此它不依赖于您正在编译的系统。

尝试尽可能多地使用 POSIX 进行编写。Mac 和 Linux 原生支持 POSIX,Windows 有一个可以运行它的系统(据我所知 - 我从未真正使用过它)。如果您的应用程序是图形化的,Mac 和 Linux 都支持 X11 库(Linux 本身,Mac 通过 X11.app),并且有多种方法可以让 X11 应用程序在 Windows 上运行。

但是,如果您正在寻找真正的多平台部署,您可能应该切换到 Java 或 Python 等语言,这些语言能够在多个系统上运行相同的程序,而无需进行任何更改。

编辑:我刚刚下载了该应用程序并查看了文件。它似乎在一个目录中包含所有 3 个平台的二进制文件。如果您关心的是如何编写可以在不丢失设置的情况下从一台计算机移动到另一台计算机的应用程序,您可能应该将所有配置写入与可执行文件位于同一目录中的文件,并且不要触摸 Windows 注册表或在其中创建任何点目录在 Linux 或 Mac 上运行程序的用户的主文件夹。就创建跨发行版 Linux 二进制文件而言,32 位 POSIX/X11 可能是最安全的选择。我不确定 JungleDisk 使用什么,因为我目前使用的是 Mac。

确实存在很少的可移植库,只是我过去工作过的例子

1)glib和gtk+

2)libcurl

3)libapr

这些几乎涵盖了所有平台,因此它们是非常有用的工具。

Posix 在 Unices 上很好,但我怀疑它在 Windows 上是否那么好,此外我们没有任何用于便携式 GUI 的东西。

XVT 拥有跨平台 GUI C API,该 API 已成熟 15 年以上,位于本机窗口工具包之上。 请参阅 WWW.XVT.COM。

它们至少支持 LINUX、Windows 和 MAC。

我还赞同将不同平台的代码分成不同的模块/树而不是 ifdef 的建议。

另外,我建议您事先检查一下您的平台有何差异以及如何抽象它们。例如。这是一些与操作系统相关的东西(例如文本文件中烦人的 CR、CRLF、LF)或硬件内容。例如。前面提到的 posix 兼容性并不能阻止你

int c;
fread(&c, sizeof(int), 1, file);

但在不同的硬件平台上,内部内存布局可能完全不同(字节序),迫使您在某些目标平台上使用转换函数。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top