使用C语言编写跨平台应用程序

14

在使用C语言编写跨平台应用程序时,需要特别注意哪些事项?目标平台:32位Intel基础PC、Mac和Linux。我尤其想寻求与Jungle Disk USB桌面版本 ( http://www.jungledisk.com/desktop/download.aspx ) 相似的多功能性。

这种开发类型有什么提示和“陷阱”?

8个回答

10
我多年来维护过一个 ANSI C 网络库,该库已在近 30 种不同的操作系统和编译器上进行了移植。由于该库没有任何 GUI 组件,这使得工作更加轻松。我们将任何在各平台上不一致的例程抽象出来并放到专门的源文件中,并在这些源文件中适当地使用 #define。这样可以将针对每个平台进行调整的代码隔离开来,远离库的主要业务逻辑。我们还广泛使用 typedef 和我们自己的专用类型,以便在需要时可以轻松更改它们。这使得将库移植到64位平台变得相对容易。
如果您想使用 GUI 组件,我建议查看 GUI 工具包,例如 WxWindows 或 Qt(它们都是 C++ 库)。

7

尽量避免使用依赖特定平台的 #ifdef 语句,因为当你添加新平台时,这些语句会呈指数级增长。相反,将源文件组织成一棵树,其中根节点是与平台无关的代码,而"叶子"节点则是与平台相关的代码。有一本好书讨论了这个主题,《多平台代码管理》。其中的示例代码可能已经过时,但书中介绍的思想仍然非常重要。


4

除了Kyle的回答,我强烈建议不要尝试在Windows中使用Posix子系统。它的实现仅到绝对最低限度,以便微软可以在功能表的勾选框中声称拥有“Posix支持”。也许某些人确实使用它,但我从未在现实生活中遇到过。

人们肯定可以编写跨平台的C代码,只需要注意不同平台之间的差异,并进行测试、测试和测试。单元测试和CI(持续集成)解决方案可以大大确保程序在所有目标平台上运行。

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


1

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

https://www.nappgui.com

它是免费的并且开源的。


1

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

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


0

我也赞同将不同平台的代码分别放在不同的模块/树中,而不是使用ifdefs。

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

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

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


0

确实存在一些可移植库,以下是我过去使用过的示例:

1)glib 和 gtk+

2)libcurl

3)libapr

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

在Unix系统上,Posix很好用,但是我怀疑它在Windows上并不是那么好用,而且我们没有任何可移植GUI的东西。


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。


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