跨平台软件的开发方式大体有三种
1. 移植
先在一个基准平台上开发好,通过改写部分代码移植到其他的操作系统下运行
1.1宏定义
用C/C++的编译宏指令来实现,#ifdef …#else…#endif
#ifdef WIN32
#define LOCALTIME_R(t) localtime((t))
#define SNPRINTF _snprintf
#else
#define LOCALTIME_R(t) localtime_r((t), (struct tm *)&tmres)
#define SNPRINTF snprintf
#endif
1.2. 编译环境识别
在C/C++编译器编译源码时,为了能够识别当前环境的状况,这包括编译器的类型和版本,操作系统的类型和版本,计算机CPU的类型,机器内部的字节顺序等,每种编译器内部一般规定了一些常用的宏定义,利用这些定义就可以区分出当前的编译环境了。
如果我们开发的软件需要在很多不同的平台很编译器上编译,这时候环境就比较复杂了,如果我们能够将编译环境的宏定义转换成我们自己内部的约定,然后全部使用内部的约定来处理宏,这会简化我们进行跨平台移植的操作。
// _ENV_WIN 32 or 64 bit Windows
// _ENV_WINNT Windows NT
// _ENV_WIN32 32 bit Windows
// _ENV_WIN64 64 bit Windows
#if (defined(WIN32) || defined(_WIN32) || defined(WIN64) || defined(_WIN64) || defined(__WIN32__))
#define _ENV_WIN
#if (defined(WIN32) || defined(_WIN32) || defined(__WIN32__))
#define _ENV_WIN32
#elif (defined(WIN64) || defined(_WIN64))
#define _ENV_WIN64
#endif
#ifdef _WIN32_WINNT
#define _ENV_WINNT
#endif
1.3. 定义通用的数据类型
在目前的大多数计算机系统中,基本的数据类型在字节长度上基本一致,比如int类型占4个字节,char类型占1个字节等,但有些基本的数据类型还是有差别的,比如float、double和64位的整数类型,不同的平台还是有些差别的,为了方便进行跨平台的编程,定义一个通用的数据类型可以简化花费在数据类型上的时间。
1.4. 利用平台交叉工具移植
1.4.1. 从Unix/Linux到Windows
Cygwin(http://cygwin.com/)
Cygwin由仿真层和一组工具组成,cygwin1.dll:它作为UNIX的一个仿真层,提供UNIX API功能; Cygwin工具负责创建一个UNIX或Linux的外观界面。
NuTCRACKER(http://mkssoftware.com/)
1.4.2. 从Windows到Unix/Linux
Wind/U(http://bristol.com/)
Visual MainWin(http://mainsoft.com/)
2.跨平台模块组合
3.虚拟机技术,利用平台无关的语言进行开发
虚拟的代价也很大,主要体现在降低了执行的效率