图片来源
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
- MinGW-W64
Cygwin
从概念上来说,Cygwin是一个在Windows上运行的POSIX环境(可以理解为类UNIX环境)。Cygwin为用户提供了各种POSIX系统调用和系统头文件,用户可以像使用UNIX系统一样使用Cygwin。
从实现上来说,Cygwin库提供了一个中间层,用来把POSIX系统调用翻译成Windows系统调用。
优点
- Cygwin提供了一个POSIX兼容的环境,因此UNIX代码无需经过太多修改,即可在Cygwin中进行编译。
缺点
- 编译出的可执行文件必须动态依赖于Cygwin动态库(作为中间层翻译)。
- 由于引入了中间层,编译出的可执行文件运行效率低下。
- Windows的多线程/进程实现逻辑与UNIX有很大差别,使用Cygwin编译出的多线程/进程程序,运行时可能会出现问题。
代表项目
- Cygwin
- MSYS2(其中的MSYS环境)
模拟器/虚拟机
通过动态二进制翻译技术,模拟出指定架构的处理器的行为。
优点
- 只需要提供编译好的UNIX原生二进制文件与运行时环境。这些都可以在UNIX系统中事先准备好。
缺点
- 不支持某些系统调用或指令。
- 运行效率较低。
- 该技术路线较为复杂,涉及环节多,不稳定因素多。
代表项目
- QEMU(在MSYS2中安装与运行)
- jart/blink(在Cygwin中编译、安装与运行)
代码移植技巧
对于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