APP下载

号外号外:C编译器小家族之C编译器各显神通

消息来源:baojiabao.com 作者: 发布时间:2024-05-14

报价宝综合消息号外号外:C编译器小家族之C编译器各显神通

C/C++编译器有哪些?

首先是如雷贯耳的这几位仁兄,MSVC、GCC、Cygwin、MingW(Cygwin和MingW的英文发音),另外还有些小众和新秀,像ICC(Intel C/C++ Compiler)、BCC(Borland C/C++ Compiler,快销声匿迹了)、RVCT(ARM的汇编/C/C++编译器,内建在ARM的IDE——RVDS中)、Pgi编译器……其实有一大串,我们只要熟悉常用的最强大的几款就可以了。

主流C/C++编译器|编译环境简介

MSVC

MSVC是微软Windows平台Visual Studio自带的C/C++编译器。

优点:对Windows平台支援好,编译快。

缺点:对C++的新标准支援得少。

GCC

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支援多种计算机体系芯片,如x86、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之前,请先理清一件事,那就是,如何从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和MingW的对比

作为编译环境时,都依赖于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现在据说也不是完全免费的了。

21ic整理自网络

2019-09-23 02:51:00

相关文章