【代码移植】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
  • 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/394539.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

(每日持续更新)jdk api之ObjectInputValidation基础、应用、实战

博主18年的互联网软件开发经验,从一名程序员小白逐步成为了一名架构师,我想通过平台将经验分享给大家,因此博主每天会在各个大牛网站点赞量超高的博客等寻找该技术栈的资料结合自己的经验,晚上进行用心精简、整理、总结、定稿&…

fish终端下conda activate失败

【问题】fish终端下激活conda环境报错: >> conda activate base CondaError: Run conda init before conda activate ## 然而运行 conda init fish 仍旧无法解决【解决】 参考:https://github.com/conda/conda/issues/11079 方法一&#xf…

SQL-Labs靶场“1-5”关通关教程

君衍. 一、准备工作二、第一关 基于GET单引号字符型注入1、源码分析2、联合查询注入过程 三、第二关 基于GET整型注入1、源码分析2、联合查询注入过程 四、第三关 基于GET单引号变形注入1、源码分析2、联合查询注入过程 五、第四关 基于GET双引号字符型注入1、源码分析2、联合查…

JDBC核心技术

第1章 JDBC概述 第2章 获取数据库连接 第3章 使用PreparedStatement实现CRUD操作 第4章 操作BLOB类型字段 第5章 批量插入 第6章 数据库事务 第7章 DAO及相关实现类 第8章 数据库连接池 第9章 Apache-DBUtils实现CRUD操作图像 小部件

提高供应商收发文件效率的同时,如何保障数据的安全流转?

数据文件是制造业企业的核心竞争力,一旦发生数据外泄,就会给企业造成经济损失。之前就出现过像小米二级供应商因对其下游供应商管理不善,泄露了小米汽车前后保险杠的早期设计稿事件。制造业企业与供应商之间业务联系紧密,文件流转…

OpenAI划时代大模型——文本生成视频模型Sora作品欣赏(二)

Sora介绍 Sora是一个能以文本描述生成视频的人工智能模型,由美国人工智能研究机构OpenAI开发。 Sora这一名称源于日文“空”(そら sora),即天空之意,以示其无限的创造潜力。其背后的技术是在OpenAI的文本到图像生成模…

AWK语言

一. awk awk:报告生成器,格式化输出。 在 Linux/UNIX 系统中,awk 是一个功能强大的编辑工具,逐行读取输入文本,默认以空格或tab键作为分隔符作为分隔,并按模式或者条件执行编辑命令。而awk比较倾向于将一行…

预检请求:为跨域请求保驾护航(下)

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

Python面向对象:什么是面向对象程序设计

编程范式 编程即写程序or代码,具体是指程序猿用特定的语法数据结构算法编写代码,目的是用来告诉计算机如何执行任务。 如果把编程的过程比喻为练习武功,那么编程范式指的就是武林中的各种流派,而在编程的世界里最常见的两大流派就…

numpy模块:从基础到高级的完整指南【第88篇—NumPy数组操作】

numpy模块:从基础到高级的完整指南 在Python的科学计算领域,NumPy模块是一个不可或缺的利器。它提供了丰富的数学函数和矩阵操作,使得数据处理、分析和科学计算变得更加高效。本文将带你初步了解NumPy模块,并通过实例代码深入解析…

JUC并发编程

JUC并发编程 JUC概述 JUC是java.util.concurrent包的简称,即Java并发编程工具包,目的是为了更好地支持高并发任务,让开发者进行多线程编程时有效减少竞争条件和死锁线程。 并发编程 一些基本概念: 进程与线程: 进…

C#,二叉搜索树(Binary Search Tree)的迭代方法与源代码

1 二叉搜索树 二叉搜索树(BST,Binary Search Tree)又称二叉查找树或二叉排序树。 一棵二叉搜索树是以二叉树来组织的,可以使用一个链表数据结构来表示,其中每一个结点就是一个对象。 一般地,除了key和位置…

基于 Python 深度学习的车辆特征分析系统,附源码

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…

算法之力扣数青蛙

题目连接 文章目录 题目解析算法原理第一步第二步第三步第三步第四步指向o 代码讲解代码实现 题目解析 先给大家来讲解一下这个题目的意思吧,这个题目是说呢给你一个蛙叫的字符串让你去设计一个算法求出发出这种蛙叫最少需要几只青蛙。比如说第一个样例发出这种叫声…

端口号被占用怎么解决

1、快捷键"winR"打开运行,在其中输入"cmd"命令,回车键打开命令提示符。 2、进入窗口后,输入"netstat -ano"命令,可以用来查看所有窗口被占用的情况。 比如端口号为7680的端口被占用了&#xff0c…

Python入门:常用模块—logging模块

logging日志的分级: debug(),info(),warning(),error(),critical() 5个级别 最简单用法 1 2 3 4 import logging logging.warning("user [mike] attempted wrong password more than 3 times") logging.critical("server is down") 输出&…

【洛谷题解】P1601 A+B Problem(高精)

题目链接&#xff1a;AB Problem&#xff08;高精&#xff09; - 洛谷 题目难度&#xff1a;普及- 涉及知识点&#xff1a;高精度加法 题意&#xff1a; 分析&#xff1a;直接套用高精度加法模版即可 AC代码&#xff1a; #include<bits/stdc.h> using namespace std…

【搭建跨境电商独立站】跨境电商独立站的6大模式,任你选择!

在几年前跨境电商独立站和第三方平台基本上是同步发展起来的&#xff0c;但在后期的发展过程中&#xff0c;独立站经过不同时期的革新&#xff0c;形成了自己的模式。 当你准备好搭建独立站的时候&#xff0c;首先你需要了解的就是独立站运营的模式类型&#xff0c;并找到最适合…

LiveGBS流媒体平台GB/T28181功能-redis订阅国标设备状态redis订阅通道状态subscribe device操作及示例

支持Redis订阅国标设备状态及国标通道状态上线离线 1、设备状态监听的烦恼2、device订阅2.1、设备上线消息2.2、设备离线消息2.2、通道上线消息2.2、通道离线消息 3、订阅示例3.1、连接REDIS3.2、订阅device示例3.3、设备上线示例3.3.1、注册上线后 3.4、设备离线示例3.4.1、注…

批评openai

杨立昆对OpenAI的批评主要集中在几个方面。首先&#xff0c;他反驳了OpenAI首席科学家Ilya Sutskever关于AI可能已经拥有某种自主意识的观点。杨立昆认为&#xff0c;当前的神经网络并不具备这种特定宏架构&#xff0c;因此无法拥有自主意识。他强调&#xff0c;即使是最轻微的…