在使用C语言编写跨平台应用程序时,需要特别注意哪些事项?目标平台:32位Intel基础PC、Mac和Linux。我尤其想寻求与Jungle Disk USB桌面版本 ( http://www.jungledisk.com/desktop/download.aspx ) 相似的多功能性。
这种开发类型有什么提示和“陷阱”?
在使用C语言编写跨平台应用程序时,需要特别注意哪些事项?目标平台:32位Intel基础PC、Mac和Linux。我尤其想寻求与Jungle Disk USB桌面版本 ( http://www.jungledisk.com/desktop/download.aspx ) 相似的多功能性。
这种开发类型有什么提示和“陷阱”?
尽量避免使用依赖特定平台的 #ifdef 语句,因为当你添加新平台时,这些语句会呈指数级增长。相反,将源文件组织成一棵树,其中根节点是与平台无关的代码,而"叶子"节点则是与平台相关的代码。有一本好书讨论了这个主题,《多平台代码管理》。其中的示例代码可能已经过时,但书中介绍的思想仍然非常重要。
除了Kyle的回答,我强烈建议不要尝试在Windows中使用Posix子系统。它的实现仅到绝对最低限度,以便微软可以在功能表的勾选框中声称拥有“Posix支持”。也许某些人确实使用它,但我从未在现实生活中遇到过。
人们肯定可以编写跨平台的C代码,只需要注意不同平台之间的差异,并进行测试、测试和测试。单元测试和CI(持续集成)解决方案可以大大确保程序在所有目标平台上运行。
一个好的方法是将与系统相关的东西隔离在一个或最多几个模块中。从该模块提供一个系统无关的接口。然后在该模块之上构建所有其他内容,使其不依赖于您正在编译的系统。
您可以使用NAppGUI来开发控制台和桌面应用程序。该SDK使用ANSI-C编写,您的代码将在Windows/macOS/Linux上运行。
它是免费的并且开源的。
XVT拥有一个跨平台GUI C API,已经成熟15年以上,并且位于本地窗口工具包之上。请参见WWW.XVT.COM。
他们至少支持LINUX、Windows和MAC。
我也赞同将不同平台的代码分别放在不同的模块/树中,而不是使用ifdefs。
此外,我建议事先检查一下你的平台之间的差异以及如何抽象它们。例如,这是一些与操作系统相关的内容(例如文本文件中令人讨厌的CR、CRLF、LF),或者是硬件相关的内容。例如,前面提到的posix兼容性并不会阻止你
int c;
fread(&c, sizeof(int), 1, file);
但在不同的硬件平台上,内部存储器布局可能完全不同(字节序),这将迫使您在某些目标平台上使用转换函数。
确实存在一些可移植库,以下是我过去使用过的示例:
1)glib 和 gtk+
2)libcurl
3)libapr
它们几乎覆盖了所有平台,因此它们是非常有用的工具。
在Unix系统上,Posix很好用,但是我怀疑它在Windows上并不是那么好用,而且我们没有任何可移植GUI的东西。
尽量使用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。