用C编写跨平台应用程序
用C编写跨平台应用程序时应牢记哪些事情?目标平台:32位基于Intel的PC,Mac和Linux。我特别在寻找Jungle Disk在其USB桌面版本中的多功能性(http://www.jungledisk.com/desktop/download.aspx)
这种开发的技巧和"陷阱"是什么?
解决方案
回答
尝试使用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时会使用什么。
回答
除了Kyle的回答,我强烈建议我们不要尝试在Windows中使用Posix子系统。它实现到绝对最低的最低水平,因此Microsoft可以在功能表复选框上声明" Posix支持"。也许有人在那里实际使用它,但我在现实生活中从未见过。
当然可以编写跨平台的C代码,我们只需要知道平台之间以及测试,测试,测试之间的差异即可。单元测试和CI(持续集成)解决方案将确保程序在所有目标平台上都能正常工作。
一个好的方法是最多将一个系统相关的内容隔离在一个或者几个模块中。从该模块提供与系统无关的接口。然后在该模块之上构建其他所有内容,因此它不依赖于要编译的系统。
回答
我维护了ANSI C网络库很多年,该库已移植到接近30种不同的OS和编译器上。该库没有任何GUI组件,因此更加容易。我们最终将跨平台不一致的任何例程抽象到专用源文件中,并在这些源文件中的适当位置使用了#defines。这使每个平台调整的代码与库的主要业务逻辑隔离开来。我们还广泛使用typedef和我们自己的专用类型,以便我们可以根据需要轻松地在每个平台上更改它们。这使得移植到64位平台变得相当容易。
如果我们希望拥有GUI组件,建议我们查看GUI工具箱,例如WxWindows或者Qt(均为C ++库)。
回答
尝试避免依赖平台的#ifdef,因为当我们添加新平台时,它们会呈指数增长。相反,请尝试将源文件组织成一棵树,在根目录中有平台无关的代码,在"叶子"中有平台相关的代码。关于该主题的一本好书是《多平台代码管理》。其中的示例代码可能看起来已经过时了,但是本书中描述的想法仍然非常重要。
回答
确实存在很少的可移植库,仅是我过去工作过的示例
1)glib和gtk +
2)libcurl
3)libapr
这些几乎涵盖了所有平台,因此它们是极其有用的工具。
Posix在Unices上很好,但是我怀疑在Windows上是否很棒,此外我们那里没有用于便携式GUI的任何东西。
回答
XVT有一个跨平台的GUI C API,该API已成熟15年以上,位于本机窗口工具块的顶部。请参阅WWW.XVT.COM。
它们至少支持LINUX,Windows和MAC。
回答
我还建议将用于不同平台的代码分为不同的模块/树而不是ifdefs。
我还建议事先检查平台有什么区别以及如何抽象它们。例如。这是一些与操作系统相关的内容(例如,文本文件中令人讨厌的CR,CRLF,LF)或者硬件内容。例如。前面提到的posix兼容性不会阻止我们
int c; fread(&c, sizeof(int), 1, file);
但是在不同的硬件平台上,内部存储器布局可能会完全不同(字节顺序),从而迫使我们在某些目标平台上使用转换功能。