繁体   English   中英

在 C 中编写跨平台应用程序

[英]Writing cross-platform apps in C

C写跨平台应用最需要注意什么? 目标平台:基于 Intel 的 32 位 PC、Mac 和 Linux。我特别在寻找 Jungle Disk 在其 USB 桌面版( http://www.jungledisk.com/desktop/download.aspx )

此类开发的技巧和“陷阱”是什么?

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

如果您希望拥有GUI组件,我建议您查看GUI工具包,例如WxWindows或Qt(它们都是C ++库)。

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

继Kyle的回答之后,我强烈建议不要尝试在Windows中使用Posix子系统。 它实现了绝对最低级别,以便Microsoft可以在功能表单勾选框中声明“Posix支持”。 也许有人在那里实际使用它,但我从未在现实生活中遇到它。

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

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

尝试尽可能多地使用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上。

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

1)glib和gtk +

2)libcurl

3)libapr

这几乎涵盖了所有平台,因此它们是极其有用的工具。

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

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

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

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

另外,我建议事先检查一下你的平台有什么不同,以及如何抽象它们。 例如,这是一些OS相关的东西(例如文本文件中烦人的CR,CRLF,LF)或硬件东西。 例如前面提到的posix兼容性并不能阻止你

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

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

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

https://www.nappgui.com

它是免费的和开源的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM