C/C++编译器
常见编译器
业界主流的编译器有MSVC,GCC和CLANG。他们的区别如下:
编译器 | 编译器全称 | 支持平台 | 备注 |
---|---|---|---|
MSVC | Microsoft Visual C++ | Windows | 由微软开发,主要用于Windows平台应用程序的开发。Visual Studio系列IDE默认集成了该编译器 |
GCC | GNU Compiler Collection | Windwos、Linux、macOS | 开源编译器,支持多种平台,Linux下C++开发一般默认会使用此编译器 |
CLANG | Clang / Low Level Virtual Machine | Windwos、Linux、macOS | LLVM项目的一部分,提供高效的编译性能。macOS的XCode工具默认集成了此编译器 |
MSVC
- MSVC(Microsoft Visual C++)由微软开发,主要用于Windows平台应用程序的开发。
- Visual Studio系列IDE默认集成了该编译器,可以通过下载安装Visual Studio安装包来安装。
- MSVC只能在Windows下用,不支持跨平台
MSVC主要包含以下的工具
工具 | 功能描述 |
---|---|
cl.exe | 编译程序 |
link.exe | 链接程序 |
lib.exe | 加载lib库的程序 |
nmake.exe | 用makefile进行构建、编译的工具 |
使用的时候只需要调用
cl.exe
,编译时会自动调用link.exe
,lib.exe
进行编译链接。
GCC
GCC最开始的原名是GNU C Compiler
,是GNU项目的C语言编译器。后来逐步拓展支持了更多的语言,支持编译C、C++、Fortran、Pascal、Objective-C、Java、Ada、Go等,所以变成了GNU Compiler Collection
(GNU编译器套装),是一套由GNU项目开发的支持多种编程语言的编译器工具链。
GCC支持多种平台和操作系统,包括Linux、Windows、macOS等,并且是许多开源项目和操作系统的标准编译器,如Linux内核。GCC还支持多种CPU指令集架构,如:X86、ARM等。
功能特点
支持多语言
: 支持多种编程语言,如C、C++、Fortran、Pascal、Objective-C、Java、Ada、Go等。跨平台性
: GCC编译器能够在不同的操作系统和硬件平台上编译和运行代码,确保了代码的高度可移植性。性能优化
: GCC编译器内置了多种优化策略,可以根据不同的编译选项进行代码优化,从而提升程序的运行效率。功能丰富
: 编译时可生成调试信息,便于开发者进行调试。并提供了广泛的编译选项和扩展功能,以满足不同开发者的需求。
GCC常用工具
工具 | 描述 |
---|---|
gcc | GCC的主要编译器,用于将源代码编译为可执行文件或库。支持多种语言(如C、C++、Fortran等),并提供丰富的编译选项。 |
g++ | GCC的C++编译器,用于将C++源代码编译为可执行文件或库。与gcc共享许多相同的编译选项,同时支持针对C++的特定选项。 |
gdb | GCC附带的调试器,用于调试程序。允许在程序运行时设置断点、单步执行代码、查看变量值等。支持多种编程语言,提供强大的调试功能。 |
objdump | 用于反汇编目标文件或可执行文件,显示二进制文件的汇编代码。还可显示符号表信息、重定位表等相关信息。 |
nm | 用于列出目标文件或可执行文件中的符号表。显示函数、变量以及其他符号的名称和地址。 |
ar | 用于创建、修改和提取静态库文件。允许将多个目标文件打包成一个库文件,以便在编译时链接使用。 |
size | 用于查看目标文件或可执行文件的大小信息。显示代码段、数据段和符号表等各部分的大小统计。 |
readelf | 用于显示ELF(Executable and Linkable Format)格式的二进制文件的详细信息。显示段表、符号表、动态链接信息等。 |
MinGW
MinGW(Minimalist GNU for Windows)是一个用于Windows平台的开发环境,它提供了GNU编译器集合(GCC)的Windows版本。MinGW允许开发者在Windows上使用GCC编译器来编译C、C++和其他支持的语言。MinGw只支持32位Widnows系统,MinGW-w64 支持32位和64位。所以现在说MinGW时,一般默认指的MinGW-w64,见 MinGW官网。
主要特点:
GCC编译器
: MinGW包含了GCC编译器,支持C、C++、Fortran等语言。跨平台开发
: 开发者可以使用MinGW编译的程序在Windows上运行,同时保持与Linux和其他Unix-like系统的兼容性。开源
: MinGW是开源的,遵循GNU通用公共许可证(GPL)。轻量级
: MinGW提供了一个轻量级的开发环境,不需要复杂的安装和配置。
CLANG
CLANG介绍
Clang是一个由 LLVM 项目开发的 C、C++、Objective-C 等编程语言的编译器前端。它旨在提供更快的编译速度、更好的错误报告及与GCC兼容的编译器驱动程序。Clang 是 LLVM 编译器基础设施的一部分,通常与 LLVM 后端一起使用来生成机器代码。
Clang的主要特点包括:
快速编译和低内存使用
: Clang 的设计目标之一是提供比 GCC 更快的编译速度和更低的内存占用。高质量的错误和警告信息
: Clang 提供了详细和易于理解的错误和警告信息,有助于开发者更快地找到和修复问题。与 GCC 兼容
: Clang 支持大多数 GCC 的编译器选项和工具链,使得从 GCC 迁移到 Clang 相对容易。模块化设计
: Clang 的架构是模块化的,易于扩展和集成到其他工具和流程中。支持现代语言特性
: Clang 支持最新的 C++ 标准和其他语言特性,使得开发者可以使用最新的编程技术。
Clang 不仅是一个编译器前端,还是一个强大的工具集,包括静态分析工具(clang-tidy)、代码格式化工具(clang-format)、重构工具等,这些工具可以帮助开发者提高代码质量和开发效率。
CLANG和LLVM
一个完整的编译器通常由三部分组成:
前端
(FrontEnd): 主要负责词法和语法分析,将源代码转化为抽象语法树;优化器
(Optimizer): 则是在前端的基础上,对得到的中间代码进行优化,使代码更加高效;后端
(BackEnd): 后端则是将已经优化的中间代码转化为针对各自平台的机器代码。
Clang与LLVM的关系:
更粗粒度的划分是把优化器和后端统称为后端,整个编译器就由前端和后端两部分组成。Clang就是编译器的前端,负责词法和语法分析;LLVM就是编译器的后端,负责优化和生成机器代码。
LLVM 包括了两个概念:
- 广义的 LLVM: 指的是一个完整的 LLVM 编译器框架系统,包括了前端、优化器、后端、众多的库函数以及很多的模块。
- 狭义的 LLVM: 则是聚焦于编译器后端功能的一系列模块和库,包括代码优化、代码生成、JIT 等。
编译器安装
Windows安装MSVC
- 打开微软的官网,下载
用于Visual Studio的工具
——Visual Studio 2022 生成工具
- 下载后打开
vs_buildTool.exe
,选择使用C++的桌面开发
,安装MSVC工具集 - 安装完成MSVC工具集之后,默认的安装文件夹为
C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools
,该工具集包括C/C++编译器、链接器、汇编程序和其他生成工具以及匹配的库和头文件。
Windwos安装mingw-w64
- 进入mingw-w64的下载网址
- 找到MinGW-W64-builds
- 选择版本,参考:
[目标架构]-[版本]-release-[POSIX线程库/Windows线程库]-[异常处理模型推荐seh]-[运行时库版本]-[构建修订版本]
,MSVCRT(Microsoft Visual C++ Runtime)和 UCRT(Universal C Runtime)是 Microsoft Windows 上的两种 C 运行时库。MSVCRT 在所有 Windows 版本上均可用,从 Windows 10 起,支持 UCRT。若支持 UCRT 则建议选择 UCRT。根据需求选择了x86_64-15.1.0-release-win32-seh-ucrt-rt_v12-rev0.7z
- 下载完成后解压
- 设置环境变量
Ubuntu安装GCC
1
2
3
4
# 更新软件源
sudo apt update
# 通过以下命令安装编译器和调试器
sudo apt install build-essential gdb
安装完成后,通过以下命令来验证
1
gcc --version
安装多个版本的GCC
输入下面的命令,安装想要的 GCC 和 G++ :
1
sudo apt install gcc-8 g++-8 gcc-9 g++-9 gcc-10 g++-10
下面的命令配置每一个版本,并且设置了优先级。默认的版本是拥有最高优先级的那个,在我们的场景中是gcc-10。
1
2
3
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 100 --slave /usr/bin/g++ g++ /usr/bin/g++-10 --slave /usr/bin/gcov gcov /usr/bin/gcov-10
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 90 --slave /usr/bin/g++ g++ /usr/bin/g++-9 --slave /usr/bin/gcov gcov /usr/bin/gcov-9
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 80 --slave /usr/bin/g++ g++ /usr/bin/g++-8 --slave /usr/bin/gcov gcov /usr/bin/gcov-8
以后,如果你想修改默认的版本,使用update-alternatives
命令:
1
sudo update-alternatives --config gcc
输出:
1
2
3
4
5
6
7
8
There are 3 choices for the alternative gcc (providing /usr/bin/gcc).
Selection Path Priority Status
------------------------------------------------------------
* 0 /usr/bin/gcc-10 100 auto mode
1 /usr/bin/gcc-10 100 manual mode
2 /usr/bin/gcc-8 80 manual mode
3 /usr/bin/gcc-9 90 manual mode
Press <enter> to keep the current choice[*], or type selection number:
你将会被展示一系列已经安装在你的 Ubuntu 系统上的 GCC 版本。输入你想设置为默认的 GCC 版本,并且按回车Enter。 这个命令将会创建符号链接到指定版本的 GCC 和 G++。