用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一样。


推荐阅读

    linux命令提示符井号?

    linux命令提示符井号?,地址,工作,系统,命令,目录,用户,路径,终端,表示,代表,l

    linux命令输入提示?

    linux命令输入提示?,地址,系统,工作,命令,分析,网站,环境,异常,信息,电脑,lin

    linux命令提示符大全?

    linux命令提示符大全?,系统,管理,环境,信息,数据,庞大,工具,标准,命令,用户,L

    linux常用命令提示符?

    linux常用命令提示符?,地址,工作,系统,信息,管理,目录,命令,路径,控制台,图

    linux命令提示目录?

    linux命令提示目录?,工作,标准,信息,名称,系统,命令,数据,软件,目录,文件,在l

    命令提示符输错linux?

    命令提示符输错linux?,位置,信息查询,状态,环境,不了,命令,模式,后面,编辑,

    linux发命令提示输入?

    linux发命令提示输入?,系统,密码,工作,环境,终端,首页,分行,首次,命令,提示

    linux命令提示符太长?

    linux命令提示符太长?,系统,工作,第一,环境,数字,命令,终端,提示符,程序,表

    linux终端提示命令?

    linux终端提示命令?,工作,系统,信息,命令,地址,代码,标准,目录,项目,名称,lin

    linux系统提示命令?

    linux系统提示命令?,系统,工作,地址,信息,命令,管理,标准,名称,设备,服务,Lin

    linux打开命令提示?

    linux打开命令提示?,系统,首页,代码,终端,环境,项目,电脑,命令,快捷键,窗口,l

    linux命令提示符默认?

    linux命令提示符默认?,系统,标准,信息,基础,代码,软件,美元,电脑,提示符,用

    linux命令和应用程序?

    linux命令和应用程序?,软件,系统,环境,管理,基础,情况,位置,电脑,工具,中心,

    linux命令提示快捷键?

    linux命令提示快捷键?,系统,名称,电脑,终端,快捷键,首页,发行,管理,信息,命

    linux命令行提示工具?

    linux命令行提示工具?,工作,系统,地址,信息,工具,命令,目录,环境,管理,状态,L

    linux命令记不全提示?

    linux命令记不全提示?,观察,工具,命令,状态,数据,电脑,信息,文件,终端,模式,l

    linux命令提示窗口?

    linux命令提示窗口?,单位,系统,人工智能,工具,环境,网络,代码,发行,电脑,产

    python与平台有关吗

    python与平台有关吗,平台,一致,环境,代码,设计,项目,培训,语言,操作,二进制