用 C 编写跨平台应用程序

Posted

技术标签:

【中文标题】用 C 编写跨平台应用程序【英文标题】:Writing cross-platform apps in C 【发布时间】:2008-08-30 05:30:24 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

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

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

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

【讨论】:

【参考方案4】:

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

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

【讨论】:

【参考方案5】:

尽量使用 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 上。

【讨论】:

【参考方案6】:

确实存在相当多的可移植库,只是我过去工作过的示例

1) glib 和 gtk+

2) 库卷曲

3) 库

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

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

【讨论】:

【参考方案7】:

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

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

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

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

【讨论】:

【参考方案8】:

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

https://www.nappgui.com

它是免费且开源的。

【讨论】:

以上是关于用 C 编写跨平台应用程序的主要内容,如果未能解决你的问题,请参考以下文章

如何编写跨平台C/C++代码的一些断想

Lua语言新手简单入门教程

使用复杂的 GUI 编写跨平台应用程序

win7平台下编译的JAVA程序能在linux系统下运行么

用React Native编写跨平台APP

用React Native编写跨平台APP