推荐几款C/C++的编译器、编译环境(非常全面的比较)

 更新时间:2021年06月06日 09:03:01   投稿:mdxy-dxy  
这篇文章主要介绍了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现在据说也不是完全免费的了。

网络上的对比列表(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***不同,也就是名字混淆方式不同。

15款最好的C/C++编译器和集成环境

编程语言有许多,而且新的语言层出不穷,但是C 和 C++作为历史悠久的两门语言,久经考验,仍然是晋级高手的必修语言,它们有着许多卓越的特性,更高效的功能和支持工具。现在这两种语言依然那么活跃,因为它们的 rubout 函数集提供了巨大的安全保障,可靠性非常强。

工欲善其事必先利其器,今天我们介绍的是一些超级棒的 C 和 C++ 的集成开发环境(IDE)和编译器。IDE 主要是在程序员开发时提供各种软件应用组件,最受程序员受欢迎的 IDE 都有一个共同点,那就是非常有吸引力的用户界面。这里我们收集了一些最好的 C 和 C++ 的 IDEs 和编译器。

1) kDevelop

Kdevelop 是 C/C++ 和其他语言的开源插件可扩展 IDE,是基于 KDevPlatform ,KDevPlatform 是个开源程序集,可以作为 IDE 的基础。

KDevelop-Project 诞生于 1998 年,其目的是为 KDE 提供一个易用的集成开发环境(Integrated Development Environment)。此后,KDevelop IDE 采用 GPL 进行发布, 它支持很多程序设计语言。

是一个用于 C,C ++,Python,JavaScript 和 PHP 的跨平台 IDE

官方网站:https://www.kdevelop.org/

2) Anjuta

Anjuta Devstudio 是另一个卓越的开发环境,拥有很多超棒的功能,包括项目管理,应用程序向导,交互式调试器,源代码编辑器,版本控制,GUI 设计工具,性能分析器等等。这个 IDE 提供超强大的用户界面开发 C/C++ 程序的接口。

Anjuta是一个建立在GNU/Linux下为C、C++提供编译的集成开发环境。它最初旨在为GTK/GNOME设计,并且自身具有很好的编程属性。这其中包括项目管理、应用开发、交互调试以及强大的代码编辑和语法增彩的性质。

Anjuta成为Gnome环境下最理想的开发工具,其主要功能和KDE下的Kdevelop相似,目前最新的版本是3.2.0。

官方网站: http://anjuta.org/

3) Code Blocks

code block 是最流行的免费开源的集成环境之一,这个 IDE 包括所有开发者需要的功能,比如:高效的用户界面,编译器和调试器等等。

官方网站:https://www.codeblocks.org/

4) Visual Mingw

Visual-MigGW 是个极其抽象的开源 IDE。它所有 Windows API 都变得极其简单,可以进行快速开发。它提供一个简化代码和获取 C++ 对象的模块,提前准备好使用应用框架的环境。

官方网站:http://visual-mingw.sourceforge.net/

5) Ideone

Ideone 是 C 和 C++ 的在线编译和调试工具,支持其他的 60 种语言。这个工具提供许多强大的功能,允许程序员快速高效的编译源代码。

官方网站:https://www.ideone.com/

6) Eclipse CDT

Eclipse CDT 是最权威也是最流行的 IDE,提供超多高效的特性:支持项目创建和各种工具链的管理,标准 make 构建,源代码导航,各种源知识工具,有语法高亮显示功能的代码编辑器,可视化的调试工具,博阿奎内存,寄存器和反汇编查看器。

官方网站:http://www.eclipse.org/cdt/

7) Compilr

compiler 是个在线集成开发工具,允许用户使用工具来编写代码和创建简单的用户界面。此工具支持超级多的编程语言,比如 C,C++,Java,HTML 等等。

官方网站:https://www.crunchbase.com/organization/compilr

8) Code Lite

Code lite 是另一个超级棒的免费开源的 C 和 C++ 的 IDE,可以在所有流行的平台上运行(Windows,OS X,Linux 等)。

官方网站:https://codelite.org/

9) Netbeans C++

Netbeans 工具包括大量的 C 和 C++ 的适用的项目类型模版,可以使用动态和静态库去创建 C/C++ 应用。它包括了一系列的特性,得到了广大程序员的喜爱: Code assistance,编译器配置,单元测试,source inspection,远程开发和文件导航等等。

官方网站:https://netbeans.apache.org/kb/docs/cnd/

编译器:

10) Dev C++

Dev C++ 是个全功能的 IDE,有以下特性:1) 类查看器 2) 集成调试 3) 支持基于 GCC 的编译器 4) 项目管理 5) 编译器 6) 编辑和编译资源文件 7) 工具管理器 8) 函数列表

官方网站:https://bloodshed-dev-c.en.softonic.com/

11) Ultimate++

Ultimate++ 是个杰出的 C++ 开发框架,这个 IDE 包括 C++ 编程的模块化概念,可以使用GCC,MinGW 和 Visual C++ 。

官方网站:https://www.ultimatepp.org/

12) Digital Mars

DigitalMars 是个高性能的 C 和 C++ 的编译器,包括许多很棒的特性,比如最快的编译/链接 时间,强大的优化技术,关联设计,完整的库资源,HTML 可读文档,反汇编程序,库管理,资源编译,make 等等。有命令行和 GUI 版本,教程,示例代码,在线更新,标准模版库和其他更多的功能。

官方网站:

13) C-Free

C-Free是一款可支持多种编译器且专业化的C/C++集成开发环境(IDE)。小伙伴们可以使用这款C-Free完成需要的编辑、运行、调试C/C++、编译等操作处理。C-Free可以增强只能输入功能、添加语言加亮器、代码定位等功能。

官方网站:http://www.programarts.com/cfree_ch/index.htm

14) MinGW

MinGW 编译器提供访问微软 C 运行时功能和一些特定语言的运行时。

官方网站:http://www.mingw-w64.org/doku.php

15) Tiny C Compiler

Tiny c compiler 是最好的 C 语言编译器之一,它有许多让开发者惊讶的功能,可以在任何地方编译源代码,可以使用任何 C 动态库,可以直接编译和执行 C 源代码,包括完整的 C 预处理器和 GNU 类的汇编程序。

官方网站:https://bellard.org/tcc/

到此这篇关于推荐几款C/C++的编译器、编译环境(非常全面的比较)的文章就介绍到这了,更多相关C/C++编译器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++使用模板类实现链式栈

    C++使用模板类实现链式栈

    这篇文章主要为大家详细介绍了C++使用模板类实现链式栈,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • C++中remove与erase区别小结

    C++中remove与erase区别小结

    remove函数和 erase函数都可以实现元素的删除,本文主要介绍了C++中remove与erase区别小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-08-08
  • C语言简明讲解操作符++和--的使用方法

    C语言简明讲解操作符++和--的使用方法

    ++和--运算符分别是+=1和-=1的简写。设计这样两个运算符的本意是⽅便程序员,但i++和++i使⽤不恰当有时候会造成混淆,反倒令刚入门的C程序员有点混乱
    2022-04-04
  • c++ 构造函数的初始化列表

    c++ 构造函数的初始化列表

    构造函数的初始化列表仅仅指定用于初始化成员的值,并不指定这些初始化执行的次序。成员初始化的次序就是定义成员的次序,第一个成员首先被初始化,然后是第二个,依次类推
    2013-07-07
  • C语言实现经典扫雷小游戏的示例代码

    C语言实现经典扫雷小游戏的示例代码

    扫雷游戏是在一个指定的二维空间里,随机布置雷,把不是雷的位置都找出来,在你点一个位置的时候它会显示它周围全部雷的个数,根据这个线索去找 ,会更容易赢。本文将用C语言实现这一经典游戏,感兴趣的可以尝试一下
    2022-11-11
  • C++实现AVL树的基本操作指南

    C++实现AVL树的基本操作指南

    AVL树是高度平衡的而二叉树,它的特点是AVL树中任何节点的两个子树的高度最大差别为1,下面这篇文章主要给大家介绍了关于C++实现AVL树的相关资料,需要的朋友可以参考下
    2022-01-01
  • Windows安装配置C/C++(VS2017)OpenSSL开发环境配置教程

    Windows安装配置C/C++(VS2017)OpenSSL开发环境配置教程

    这篇文章主要为大家详细介绍了Windows安装配置C/C++,OpenSSL开发环境配置教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • C++服务器和客户端交互的项目实践

    C++服务器和客户端交互的项目实践

    本文主要介绍了C++服务器和客户端交互的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • 解析为何要关闭数据库连接,可不可以不关闭的问题详解

    解析为何要关闭数据库连接,可不可以不关闭的问题详解

    本篇文章是对为何要关闭数据库连接,可不可以不关闭的问题进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • 浅析C++中的动态内存分配

    浅析C++中的动态内存分配

    这篇文章主要为大家详细介绍了C++中动态内存分配的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-03-03

最新评论