用C编写跨平台应用程序

用C编写跨平台应用程序

Writing cross-platform apps in C

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

提示和"陷阱"是什么?对于这种类型的开发?


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

如果您要使用GUI组件,建议您使用WxWindows或Qt(均为C库)之类的GUI工具包。


尝试避免依赖于平台的#ifdef,因为当您添加新平台时,它们会呈指数增长。而是尝试将您的源文件组织为一棵树,在根目录中具有平台无关的代码,在" leaves "上具有平台相关的代码。关于该主题的一本好书是《多平台代码管理》。其中的示例代码可能看起来已经过时了,但是本书中描述的想法仍然非常重要。


除了Kyle的回答,我强烈建议您不要尝试在Windows中使用Posix子系统。它实现到绝对最低的最低水平,因此Microsoft可以在功能表复选框上声明" Posix support "。也许有人在那里实际使用它,但是我在现实生活中从未见过。测试一下。单元测试和CI(持续集成)解决方案将确保您的程序在所有目标平台上都能正常工作。

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


XVT具有一个跨平台的GUI C API,该API已成熟15年,位于本机窗口工具的顶部。请参阅WWW.XVT.COM。

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


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

我也建议事先检查您的平台有什么区别以及如何抽象它们。例如。这是一些与操作系统相关的资料(例如,文本文件中令人讨厌的CR,CRLF,LF)或硬件资料。例如。前面提到的posix兼容性并不能阻止您在

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

上运行,但是在不同的硬件平台上,内部内存布局可能会完全不同(字节性),从而迫使您在某些目标平台上使用转换功能。


确实存在很少的可移植库,只是我过去使用过的示例

1)glib和gtk

2)libcurl

3)libapr

几乎可以覆盖所有平台,因此它们是极其有用的工具。

Posix在Unices上很好,但是我怀疑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可能是最安全的选择。我不确定像我在Mac上当前使用的JungleDisk一样。


推荐阅读