集团公司网站案例,ps海报设计教程网页,网站建设哪里好,自己做的php网站进行伪静态C/C 代码是不可跨平台的#xff0c;Windows 和 Unix-like 有着不同的 API#xff0c;C/C 在不同平台有着不同编译器。
MSVC
Windows 平台#xff0c;MSVC 是 Visual Studio 中自带的 C/C 编译器。
GCC
Unix-like 平台#xff0c;GCC 原名 GNU C Compiler#xff0c;后…C/C 代码是不可跨平台的Windows 和 Unix-like 有着不同的 APIC/C 在不同平台有着不同编译器。
MSVC
Windows 平台MSVC 是 Visual Studio 中自带的 C/C 编译器。
GCC
Unix-like 平台GCC 原名 GNU C Compiler后来逐渐支持更多的语言编译C、Fortran、Pascal、Objective-C、Java、Ada、Go等所以变成了 GNU Compiler CollectionGNU 编译器套装是一套由 GNU 工程开发的支持多种编程语言的编译器。不过随着时间推移由于各种原因GCC 除核心语言 C/C 之外语言的编译器要么不再维护要么支持的规范有限例如 GCC 中的 Java 编译器 gcj 已被废弃主流使用 JDK 中的 javac其他非核心语言编译器处境大同小异故实质上 GCC 目前核心就是 gcc 和 g。
如何从Unix-like系统向Windows系统移植软件
现代操作系统包括Windows和Linux的基本设计概念像进程线程地址空间虚拟内存这些都大同小异二者之上的程序之所以不兼容主要是它们对这些功能具体实现上的差异
首先是可执行文件的格式Window使用PE的格式并且要求以.EXE为后缀名Linux则使用Elf。
其次操作系统API也同比如Windows用CreateProcess()创建进程而Unix-like系统则使用fork()其他还有很多诸如spawn、signals、select、sockets等。
分析之后可知要把Unix-like系统上的软件移植到Windows上有几种思路
第一种修改软件源码并重新编译这个方法最笨类Unix下大量的软件要修改工作量很大编译生成目标平台可执行文件格式。
第二种不修改软件源码但把类Unix接口调用悄悄替换为WinAPI还是需要重新编译编译生成目标平台可执行文件格式。
第三种无缝移植的运行环境无需重新编译在一种OS上建立另一中OS的应用软件虚拟环境和虚拟机不一样比如Wine把Windows上的可执行程序直接原样移植到Linux上。
Cygwin 和 MingWMinimalist GNU for Windows 均是对 第二种 方案的实现。
第二种方案有两个问题要解决
把类Unix接口调用悄悄替换为WinAPI在 Windows 平台下将 Unix-like 平台代码编译为 Windows 下可执行文件
Cygwin和MingW均是对 GCC 进行的封装 GCC 具有交叉编译能力可以解决第二个问题Cygwin和MingW均对 GCC 进行封装由 GCC 编译 Unix-like 代码得到 Windows 平台下的 PE 格式可执行文件。
Cygwin和MingW各自的工作主要是解决第一个问题两者采用了不同思路。
Cygwin和MingW都是第二种软件移植思路当然二者还是有区别区别就在于“替换”方式Cygwin编译时程序依然以Linux的方式调用系统API只不过把Unix-like接口link到自己的cygwin1.dll上然后在cygwin1.dll中重新调用Windows APIcygwin1.dll再调用Windows对应的实现来把结果返回给程序。也就是说他们基于Win32 API中写了一个Unix系统API的重定向层所以用它移植的软件都依赖于cygwin1.dllMingW编译时通过特有的WinAPI头文件把类Unix-like调用替换为WinAPI用它移植的软件无需依赖第三方库可直接运行在Windows平台。为了达到类Unix软件仅通过重新编译移植到Win的目的Cygwin在运行时偷梁换柱MingW在编译时偷梁换柱。
用一个PE格式查看工具检查一下就能发现Cygwin生成的程序依然有fork()这样的Linux系统调用但目标库是cygwin1。而MingW生成的程序则全部使用从KERNEL32导出的标准Windows系统API。
推荐使用 MingW
https://www.cnblogs.com/findumars/p/6250998.html