【代码移植】UNIX/Linux/POSIX代码程序移植到Windows系统平台技术汇总与经验分享


LinuxWindows
图片来源

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
  • 30
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值