C/C++编译器的一些易混淆概念,总结一下。
关于什么是Unix-like操做系统,常见操做系统间差别,什么是操做系统接口等等,请参考《操做系统宝鉴》。java
首先是如雷贯耳的这几位仁兄,MSVC、GCC、Cygwin、MingW(Cygwin和MingW的英文发音),另外还有些小众和新秀,像ICC(Intel C/C++ Compiler)、BCC(Borland C/C++ Compiler,快销声匿迹了)、RVCT(ARM的汇编/C/C++编译器,内置在ARM的IDE——RVDS中)、Pgi编译器……其实有一大串,咱们只要熟悉经常使用的最强大的几款就能够了。算法
MSVCshell
MSVC是微软Windows平台Visual Studio自带的C/C++编译器。编程
优势:对Windows平台支持好,编译快。windows
缺点:对C++的新标准支持得少。网络
GCCsocket
GCC原名GNU C Compiler,后来逐渐支持更多的语言编译(C++、Fortran、Pascal、Objective-C、Java、Ada、Go等),因此变成了GNU Compiler Collection(GNU编译器套装),是一套由GNU工程开发的支持多种编程语言的编译器。GCC是自由软件发展过程当中的著名例子,由自由软件基金会以GPL协议发布,是大多数类Unix(如Linux、BSD、Mac OS X等)的标准编译器,并且适用于Windows(借助其余移植项目实现的,好比MingW、Cygwin等)。GCC支持多种计算机体系芯片,如x8六、ARM,并已移植到其余多种硬件平台。编程语言
优势:类Unix下的标准编译器,支持众多语言,支持交叉编译。工具
缺点:默认不支持Windows,须要第三方移植才可用于Windows。性能
Cygwin
Cygwin是一个Windows下Unix-like模拟环境,具体说就是Unix-like接口(OS API,命令行)重定向层,其目的是不修改软件源码仅从新编译就能够将Unix-like系统上的软件移植到Windows上(这个移植也许还算不上严格意义上的无缝移植)。始于1995年,最初做为Cygnus软件公司工程师Steve Chamberlain的一个项目。
和GCC的关系:Cygwin是让Windows拥有Unix-like环境的软件而不是编译器,GCC是安装在Cygwin上的编译器。
优势:能够比MingW移植更多的软件到Windows上,对Linux接口模拟比MingW全面。
缺点:软件运行依赖cygwin1.dll,速度受点影响。
注意:Unix-like模拟环境不是Unix虚拟环境,不少论述中都声称Cygwin是在Windows上尽量模拟类Unix环境,这容易形成误解,好像类Unix的elf程序能够直接运行在安装了Cygwin的Windows上同样。Cygwin和Wine的思路是不一样的。在Windows+Cygwin上你能够像类Unix那样使用命令行和编程,但elf等非exe格式的程序是不能被Cygwin运行的,因此Cygwin和Unix虚拟机、Wine是彻底不一样的,叫Unix-like环境,模拟非虚拟,是有限的选择性的模拟,请不要误解。
MingW
MingW(Minimalist GNU on Windows)是一个Linux/Windows下的能够把软件源码中Unix-like OS API调用经过头文件翻译替换成相应的Windows API调用的编译环境,其目的和Cygwin相同。从而把Linux上的软件在不修改源码的状况下编译为可直接在Win下执行的exe。
和GCC的关系:MingW是编译环境,不是编译器,GCC是MingW中的核心组成。
优势:在Win下能够和Linux同样的方式编译C/C++源码,能够说是Win版的GCC,其生产的Windows PE程序相比Cygwin不依赖任何第三方库,比Cygwin纯粹,理论上也更快速。
缺点:编译速度、编译出的程序在算法上可能都比MSVC慢。
注意:与Windows下其它编译器不一样的是,MinGW与Linux下普遍使用的GNU近乎彻底兼容,这意味着,在Linux下如何编译源代码,在MinGW中也能够以彻底相同的方式编译。有些Linux下的开发人员(好比开源阵营)发布的源代码一般只提供Linux下的编译方式,而不提供Windows下的编译方式(这可能与其不熟悉windows操做系统有关),但确实有很多用户须要在在Windows下编译使用此源代码。这在种状况下,若是Windows用户想用VC、BC等编译器编译该源代码,必须重写Makefile(各类编译器所支持的Makefile不尽相同),工做量比较大不说,还很难保证不出错。MinGW的出现,提供了两个平台下的“跨平台编译方案”。MinGW与MSYS相配合,连./configure都有了。与GNU不一样的是,MinGW编译生成的是Windows下的可执行文件(.exe)或库文件(.dll,.lib)——不过编译过程当中的的中间文件仍然是.o文件,而不是.obj文件(这固然无所谓了,中间文件嘛,编译完成后就没有用了)。
在咱们对比Cygwin和MingW以前,请先理清一件事,那就是,
现代操做系统包括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上)。
做为编译环境时,都依赖于GCC
用它们做编译环境、交叉编译,根本上都是由于GCC编译器的支持,它们作的工做是为GCC的编译扫除Unix-like、Windows间OS API的差别这个障碍。
两者都必须从新编译后实现移植,生成的程序都是PE格式
两者都不能让Linux下的程序直接运行在Windows上(无缝移植),必须经过源代码从新编译。有些人声称cygwin支持rpm的压缩包,注意,rpm压缩包实际上是src.rpm,内部仍是源码而非elf格式,cygwin不支持常规rpm包的安装。
Cygwin运行在Windows上,MingW运行在Linux或者Windows上
Cygwin是Windows上运行的Unix-like环境,MingW是运行在Linux或者Windows上的Windows PE编译环境。
MingW中的子项目MSys和Cygwin更像
Cygwin除了全面模拟Linux的接口(命令行,OS API),提供给运行在它上面的的Windows程序使用,并提供了大量现成的软件,更像是一个平台。MingW也有一个叫MSys(Minimal SYStem)的子项目,主要是提供了一个模拟Linux的Shell和一些基本的Linux工具。由于编译一个大型程序,光靠一个GCC是不够的,还须要有Autoconf等工具来配置项目,因此通常在Windows下编译ffmpeg等Linux下的大型项目都是经过Msys来完成的,固然Msys只是一个辅助环境,根本的工做仍是MingW来作的。
实现思路有同有异
Cygwin和MingW都是第二种软件移植思路,固然,两者仍是有区别,区别就在于“替换”方式,Cygwin编译时,程序依然以Linux的方式调用系统API,只不过把Unix-like接口link到本身的cygwin1.dll上,而后在cygwin1.dll中从新调用Windows API,cygwin1.dll再调用Windows对应的实现,来把结果返回给程序。也就是说,他们基于Win32 API中写了一个Unix系统API的重定向层,因此用它移植的软件都依赖于cygwin1.dll,MingW编译时经过特有的WinAPI头文件把类Unix-like调用替换为WinAPI,用它移植的软件无需依赖第三方库,可直接运行在Windows平台。为了达到类Unix软件仅经过从新编译移植到Win的目的,Cygwin在运行时偷梁换柱,MingW在编译时偷梁换柱。
用一个PE格式查看工具检查一下就能发现,Cygwin生成的程序依然有fork()这样的Linux系统调用,但目标库是cygwin1。而MingW生成的程序,则所有使用从KERNEL32导出的标准Windows系统API。
使用方式有同有异
把类Unix上的软件移植到Windows是两者的主要目标,除此以外,顺带的,MingW和Cygwin均可以用来跨平台开发等等其余事情,
Windows + Cygwin:能够在Windows上学习Linux命令,还能够在Windows上作Linux软件的开发,包括用GCC编译elf(交叉编译)。
Linux + MingW:能够在Linux上作Windows软件的开发,包括用GCC编译exe(交叉编译)。
Windows/Linux + MingW:能够摆脱MSVC的“束缚”,用GNU的自由软件来编译生成不依赖第三方库的纯粹Windows PE格式(exe)二进制程序。
Cygwin重量级,MingW轻量级
与MingW思路一致的,二者相比,Cygwin是重量级的(需下载50M以上直至数百兆不等,安装后占用空间可达1G),MinGW是轻量级的(需下载的文件只有20M,安装后70M左右),这是单纯从体积上说的,另外Cygwin如今听说也不是彻底免费的了。
网络上的对比列表(UnxUtils自行无视,仅供参考)
功能 |
UnxUtils |
MinGW |
Cygwin |
设计原理 |
原生 |
原生 |
模拟 |
运行依赖 |
无依赖 |
依赖msys.dll(必定依赖它吗?值得验证) |
依赖cygwin.dll |
运行性能(比较) |
最快 |
中等 |
慢 |
DOS执行 |
能够 |
能够 |
不能够 |
更新速度 |
完善中止更新 |
较慢 |
基本同步gcc |
shell命令 |
较多 |
较少 |
较多 |
uname |
WindowsNT |
MINGW32_NT-5.1 |
CYGWIN_NT-5.1 |
env |
同Windows |
同Windows |
不彻底同Windows |
root |
C:/ |
C:/ |
/ |
home |
C:/Documents and Settings/test |
/home/test: No such file or directory |
/home/test |
pwd |
C:/bin |
/usr/bin |
/home/test |
df |
cannot read table of mounted filesystems |
无 |
/cygdrive/c |
vi |
无 |
无 |
有 |
gcc套件 |
无 |
有 |
有 |
开发库 |
无 |
WinAPI |
POSIX |
图形库 |
无 |
GTK/QT |
GTK/QT |
可移植性 |
无 |
Win32API不可移植 |
无缝移植 |
程序运行 |
无 |
原生 |
模拟 |
程序依赖 |
无 |
无 |
cygwin.dll |
程序性能(比较) |
无 |
较快(慢于VC和Linux下的gcc) |
较慢(快于java) |
一个编译器编译时可否调用编译其余编译器产生的lib、dll?
不能够,name***不一样,也就是名字混淆方式不一样。
http://rendao.org/blog/1071/