14

用 C 编写跨平台应用程序时最应该牢记什么?目标平台:基于 Intel 的 32 位 PC、Mac 和 Linux。我特别在寻找 Jungle Disk 在其 USB 桌面版 ( http://www.jungledisk.com/desktop/download.aspx )中的多功能性类型

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

4

8 回答 8

10

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

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

于 2008-08-30T05:48:56.537 回答
7

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

于 2008-08-30T07:02:03.553 回答
4

除了 Kyle 的回答,我强烈建议不要尝试在 Windows 中使用 Posix 子系统。它已实现到绝对最低级别,因此 Microsoft 可以在功能表复选框上声明“Posix 支持”。也许有人真的在使用它,但我在现实生活中从未遇到过。

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

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

于 2008-08-30T05:47:06.510 回答
1

XVT 有一个跨平台的 GUI C API,它已经成熟了 15 年以上,并且位于本机窗口工具包之上。参见 WWW.XVT.COM。

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

于 2008-12-16T17:39:16.493 回答
0

尝试使用 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 上。

于 2008-08-30T05:35:53.820 回答
0

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

1) glib 和 gtk+

2) 库卷

3)libapr

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

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

于 2008-12-16T17:33:17.300 回答
0

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

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

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

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

于 2008-12-16T17:45:17.883 回答
0

您可以将 NAppGUI 用于控制台和桌面应用程序。SDK 使用 ANSI-C,您的代码将在 Windows/macOS/Linux 上运行。

https://www.nappgui.com

它是免费和开源的。

于 2021-09-14T17:59:32.287 回答