图片来源
UNIX (Linux) to Windows代码移植技术路线
MinGW
MinGW/MinGW-W64是用Windows原生系统API实现的,在Windows上运行的GCC编译工具链,可以编译出Windows原生应用程序。
MinGW编译工具链的生态位和微软官方的MSVC类似。
优点
- MinGW编译出的程序有能力直接在Windows系统中运行,不依赖外部库文件,并且运行效率很高。
缺点
- MinGW工具链遵循Windows系统的ABI,有些定义与行为和类UNIX系统不一致。如long数据类型的字节长度。
- MinGW不支持许多UNIX的系统头文件与系统调用,需要修改代码,把UNIX系统调用翻译为Windows系统调用。
代表项目
- MSYS2
- https://www.msys2.org/
- MinGW-W64
- https://www.mingw-w64.org/
Cygwin
从概念上来说,Cygwin是一个在Windows上运行的POSIX环境(可以理解为类UNIX环境)。Cygwin为用户提供了各种POSIX系统调用和系统头文件,用户可以像使用UNIX系统一样使用Cygwin。
从实现上来说,Cygwin库提供了一个中间层,用来把POSIX系统调用翻译成Windows系统调用。
传统的Linux发行版由“Linux系统内核”与“发行版定制的外围软件”这两部分组成。某种程度上,也可以把Cygwin理解为一个特别的类UNIX发行版,它的内核为“被中间层包裹的Windows内核”,外围软件为“Cygwin定制的外围软件”。
优点
- Cygwin提供了一个POSIX兼容的环境,因此UNIX代码无需经过太多修改,即可在Cygwin中进行编译。
- 不同于MinGW,Cygwin使用LP64数据模型。long类型大小为8个字节,和Linux系统保持一致。
缺点
- 编译出的可执行文件必须动态依赖于Cygwin动态库(作为中间层翻译)。
- 由于引入了中间层,编译出的可执行文件运行效率低下。
- Windows的多线程/进程实现逻辑与UNIX有很大差别,使用Cygwin编译出的多线程/进程程序,运行时可能会出现问题。
代表项目
- Cygwin
- https://www.cygwin.com/
- MSYS2(其中的MSYS环境)
- https://www.msys2.org/
模拟器/虚拟机
通过动态二进制翻译技术,模拟出指定架构的处理器的行为。
优点
- 项目可以在UNIX系统中事先构建好。项目程序运行时,只需要为模拟器/虚拟机提供构建好的UNIX原生二进制文件与其所需的运行时环境。
缺点
- 不支持某些系统调用或指令。
- 运行效率较低。
- 该技术路线较为复杂,涉及环节多,不稳定因素多。
代表项目
- QEMU(在MSYS2中安装与运行)
- https://www.qemu.org/
- https://packages.msys2.org/base/mingw-w64-qemu
- jart/blink(在Cygwin中编译、安装与运行)
- https://github.com/jart/blink
Cosmopolitan
Cosmopolitan项目包含了一套Cosmopolitan C标准库和一套Cosmocc编译工具链。其编译出的二进制文件符合POSIX标准,并且可以原生运行在多个硬件架构(AMD64 + ARM64)的多种平台上(Linux + Mac + Windows + FreeBSD + OpenBSD + NetBSD + BIOS)。Cosmopolitan让C语言拥有了“一次编译,到处运行”的能力。
优点
- 只需要一套源码,使用Cosmopolitan编译出二进制文件,这些二进制文件可以在多个硬件架构和多个平台上原生运行。目前Cosmopolitan官方已经成功构建了Bash、Python、SQLite3、Vim、Lua等许多项目。
- 遵循System V ABI,使用LP64数据模型。
缺点
- 不支持某些系统调用或指令。
- 该项目很年轻,仍在积极开发中。目前主要支持使用autotools作为构建工具的项目。
代表项目
- jart/cosmopolitan
- https://justine.lol/cosmopolitan/index.html
- https://github.com/jart/cosmopolitan
代码移植技巧
对于MinGW技术路线,下面列举了一些常见的UNIX系统头文件,以及它们的Windows实现或对应物。
使用的C库为微软实现的MSCVRT或UCRT,C++库为MinGW实现的libstdc++。此外,还需要使用到Windows的系统API。
微软官方 UNIX代码移植指南
UNIX Code Migration Guide | Microsoft Learn
sys/resource.h
- https://github.com/JellyBrick/sys-resource-win
- https://github.com/openvswitch/ovs/blob/master/include/windows/sys/resource.h
- https://github.com/openvswitch/ovs/blob/master/lib/getrusage-windows.c
sys/mman.h
- https://github.com/alitrack/mman-win32
dirent.h
- https://github.com/tronkko/dirent
dlfcn.h
- https://github.com/dlfcn-win32/dlfcn-win32
- https://packages.msys2.org/package/mingw-w64-ucrt-x86_64-dlfcn
execinfo.h
- https://github.com/ianlancetaylor/libbacktrace