用 C 语言编写跨平台应用

Writing cross-platform apps in C

提问人:Dinah 提问时间:8/30/2008 最后编辑:chills42Dinah 更新时间:4/6/2022 访问量:8004

问:

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

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

C 跨平台 32 位

评论


答:

0赞 Kyle Cronin 8/30/2008 #1

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

4赞 Greg Hewgill 8/30/2008 #2

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

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

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

10赞 Steve Wranovsky 8/30/2008 #3

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

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

7赞 dmityugov 8/30/2008 #4

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

0赞 Friedrich 12/17/2008 #5

确实存在相当多的便携式库,只是我过去工作过的例子

1) glib 和 gtk+

2) 库库尔

3) 图书馆

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

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

1赞 AnthonyLambert 12/17/2008 #6

XVT 有一个跨平台的 GUI C API,它已经成熟了 15+ 年,位于原生窗口工具之上。请参见 WWW.XVT.COM。

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

0赞 flolo 12/17/2008 #7

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

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

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

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

1赞 frang 9/15/2021 #8

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

https://www.nappgui.com

它是免费和开源的。