ToB企服应用市场:ToB评测及商务社交产业平台

标题: 一文搞懂C/C++常用编译器 [打印本页]

作者: 乌市泽哥    时间: 2024-8-8 13:19
标题: 一文搞懂C/C++常用编译器
1. C++ 编译器先容

MSVC,GCC和Clang是业界三种最主流的C/C++编译器,下面粗劣比力一下他们的差异:
C++编译器编译器全称支持的平台备注MSVCMicrosoft Visual C++Windows由微软开发,主要用于Windows平台应用步伐的开发。Visual Studio系列IDE默认集成了该编译器GCCGNU Compiler CollectionWindows, Linux, macOS开源编译器,支持多种平台,Linux下C++开发一般默认会使用此编译器ClangClang / Low Level Virtual MachineWindows, Linux, macOSLLVM项目的一部分,提供高效的编译性能。macOS的XCode工具默认集成了此编译器1.1. MSVC

1.1.1. Visual C++与Visual Studio的版本对应关系

_MSC_VER: 是MSVC编译器内置的宏定义,可以在源代码中直接引用。其值代表了MSVC编译器的版本,如:1900表示Visual Studio 2015(MSVC++ 14.0)。
  1. MSC    1.0   _MSC_VER == 100
  2. MSC    2.0   _MSC_VER == 200
  3. MSC    3.0   _MSC_VER == 300
  4. MSC    4.0   _MSC_VER == 400
  5. MSC    5.0   _MSC_VER == 500
  6. MSC    6.0   _MSC_VER == 600
  7. MSC    7.0   _MSC_VER == 700
  8. MSVC++ 1.0   _MSC_VER == 800
  9. MSVC++ 2.0   _MSC_VER == 900
  10. MSVC++ 4.0   _MSC_VER == 1000 (Developer Studio 4.0)
  11. MSVC++ 4.2   _MSC_VER == 1020 (Developer Studio 4.2)
  12. MSVC++ 5.0   _MSC_VER == 1100 (Visual Studio 97 version 5.0)
  13. MSVC++ 6.0   _MSC_VER == 1200 (Visual Studio 6.0 version 6.0)
  14. MSVC++ 7.0   _MSC_VER == 1300 (Visual Studio .NET 2002 version 7.0)
  15. MSVC++ 7.1   _MSC_VER == 1310 (Visual Studio .NET 2003 version 7.1)
  16. MSVC++ 8.0   _MSC_VER == 1400 (Visual Studio 2005 version 8.0)
  17. MSVC++ 9.0   _MSC_VER == 1500 (Visual Studio 2008 version 9.0)
  18. MSVC++ 10.0  _MSC_VER == 1600 (Visual Studio 2010 version 10.0)
  19. MSVC++ 11.0  _MSC_VER == 1700 (Visual Studio 2012 version 11.0)
  20. MSVC++ 12.0  _MSC_VER == 1800 (Visual Studio 2013 version 12.0)
  21. MSVC++ 14.0  _MSC_VER == 1900 (Visual Studio 2015 version 14.0)
  22. MSVC++ 14.1  _MSC_VER == 1910 (Visual Studio 2017 version 15.0)
  23. MSVC++ 14.11 _MSC_VER == 1911 (Visual Studio 2017 version 15.3)
  24. MSVC++ 14.12 _MSC_VER == 1912 (Visual Studio 2017 version 15.5)
  25. MSVC++ 14.13 _MSC_VER == 1913 (Visual Studio 2017 version 15.6)
  26. MSVC++ 14.14 _MSC_VER == 1914 (Visual Studio 2017 version 15.7)
  27. MSVC++ 14.15 _MSC_VER == 1915 (Visual Studio 2017 version 15.8)
  28. MSVC++ 14.16 _MSC_VER == 1916 (Visual Studio 2017 version 15.9)
  29. MSVC++ 14.2  _MSC_VER == 1920 (Visual Studio 2019 Version 16.0)
  30. MSVC++ 14.21 _MSC_VER == 1921 (Visual Studio 2019 Version 16.1)
  31. MSVC++ 14.22 _MSC_VER == 1922 (Visual Studio 2019 Version 16.2)
  32. MSVC++ 14.30 _MSC_VER == 1930 (Visual Studio 2022 Version 17.0)
  33. MSVC++ 14.31 _MSC_VER == 1931 (Visual Studio 2022 Version 17.1)
复制代码
1.1.2. 工具链的主要工具

工具功能描述cl.exe编译步伐link.exe链接步伐lib.exe加载lib库的步伐nmake.exe用makefile举行构建、编译的工具备注: 用户只必要调用cl.exe,即可完成编译-链接全过程。因为cl.exe步伐在编译时本身会去调用link.exe、lib.exe等步伐。
1.2. 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等。
1.2.1. GCC的主要优点

1.2.2. GCC的常用工具

工具描述gccGCC的主要编译器,用于将源代码编译为可实行文件或库。支持多种语言(如C、C++、Fortran等),并提供丰富的编译选项。g++GCC的C++编译器,用于将C++源代码编译为可实行文件或库。与gcc共享许多相同的编译选项,同时支持针对C++的特定选项。gdbGCC附带的调试器,用于调试步伐。允许在步伐运行时设置断点、单步实行代码、检察变量值等。支持多种编程语言,提供强大的调试功能。objdump用于反汇编目标文件或可实行文件,显示二进制文件的汇编代码。还可显示符号表信息、重定位表等相关信息。nm用于列出目标文件或可实行文件中的符号表。显示函数、变量以及其他符号的名称和所在。ar用于创建、修改和提取静态库文件。允许将多个目标文件打包成一个库文件,以便在编译时链接使用。size用于检察目标文件或可实行文件的大小信息。显示代码段、数据段和符号表等各部分的大小统计。readelf用于显示ELF(Executable and Linkable Format)格式的二进制文件的具体信息。显示段表、符号表、动态链接信息等。1.2.3. 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官网
主要特点:
1.3. Clang/LLVM

1.3.1. Clang先容

Clang是一个由 LLVM 项目开发的 C、C++、Objective-C 等编程语言的编译器前端。它旨在提供更快的编译速度、更好的错误陈诉及与GCC兼容的编译器驱动步伐。Clang 是 LLVM 编译器基础办法的一部分,通常与 LLVM 后端一起使用来生成呆板代码。
Clang的主要特点包括:
Clang 不仅是一个编译器前端,照旧一个强大的工具集,包括静态分析工具(clang-tidy)、代码格式化工具(clang-format)、重构工具等,这些工具可以帮助开发者提高代码质量和开发服从。
1.3.2. Clang与LLVM的关系

编译器的构成:
一个完备的编译器通常由三部分构成。
前端(FrontEnd): 主要负责词法和语法分析,将源代码转化为抽象语法树;
优化器(Optimizer): 则是在前端的基础上,对得到的中间代码举行优化,使代码更加高效;
后端(BackEnd): 后端则是将已经优化的中间代码转化为针对各自平台的呆板代码。
Clang与LLVM的关系:
更粗粒度的分别是把优化器和后端统称为后端,整个编译器就由前端和后端两部分构成。Clang就是编译器的前端,负责词法和语法分析;LLVM就是编译器的后端,负责优化和生成呆板代码。
Clang/llvm的编译过程如下图:

LLVM 包括了两个概念:
1.3.3. Clang/LLVM与GCC

GCC和LLVM是竞争对手,都是编译器框架系统。GCC包含前端和后端,LLVM也包含前端和后端,只是他的前端通常是Clang,所以Clang是LLVM 编译器框架系统 的前端
他们大概的组合如下:

眼尖的同砚大概会问:为什么没有“Clang前端、GCC后端”的组合?
个人理解: GCC发展的时间非常早,带有很大的汗青包袱。GCC后端的接口设计没有那么机动,不能提供Clang充足的接口支持(这也是LLVM架构最开始设计就考虑到的标题)。
LLVM Compiler发展过程的早期就经历了LLVM-GCC这种过渡期的组合(GCC前端+LLVM后端)。
2. C++ 编译器的安装

2.1. Windows

2.1.1. MSVC安装

2.1.2. 环境变量设置

方法一 指定的下令行:
MSVC安装后会生成特定下令行工具,可以在“开始 -> 搜索”查找一下下令行:
打开对于的下令行,然后在此下令行下实行cl xx.cpp等相关编译下令。
方法二 bat脚本设置:
C:\software\MicrosoftVisualStudio\2022\BuildTools\VC\Auxiliary\Build下存在多个批处置惩罚文件,这些批处置惩罚文件可以初始化相应构建需求的环境变量:
打开cmd下令行或者power shell, 然后实行相应的.bat脚本然,再实行cl xx.cpp等相关编译下令。
方法三 手动设置:
MSVC编辑器的默认安装在C:\Program Files (x86)\Microsoft Visual Studio,安装时可以自定义安装路径。在安装目录下的2022\BuildTools\VC\Tools\MSVC\14.40.33807\bin路径下,此中有两个文件夹,分别是hostx64和hostx86,这两个文件夹下又分别有x64和x86,他们的寄义如下:
  1. bin
  2.   Hostx64 # 主机是64位的编译器
  3.     x64 # 编译的目标文件是64位程序
  4.     x86 # 编译的目标文件是32位程序
  5.   Hostx86 # 主机是32位的编译器
  6.     x64 # 编译的目标文件是64位程序
  7.     x86 # 编译的目标文件是32位程序
复制代码
根据本身的需求,选择对应的路径,如:我的主机是64位的,我盼望用64位的编译器编译32位的目标步伐,设置环境变量如下:
  1. MSVC_DIR: C:\software\MicrosoftVisualStudio\2022\BuildTools\VC\Tools\MSVC\14.40.33807
  2. include: %MSVC_DIR%\include
  3. lib: %MSVC_DIR%\lib\x86;
  4. path: %MSVC_DIR%\bin\Hostx64\x86;
复制代码
2.2. Linux(Ubuntu)

2.2.1. 安装GCC/GDB

1. 安装:
  1. # 更新软件源
  2. sudo apt update
  3. # 通过以下命令安装编译器和调试器
  4. sudo apt install build-essential gdb
复制代码
Ubuntu 默认情况下没有提供C/C++编译环境的,你可以单独安装gcc、g++等工具,但会比力麻烦。Ubuntu提供了一个build-essential软件包,安装了该软件包,编译c/c++所必要的软件包也都会被安装。
2. 校验:
  1. # 执行以下命令确认每个软件是否安装成功
  2. # 如果成功,则显示版本号
  3. gcc --version
  4. g++ --version
  5. gdb --version
复制代码
2.2.2. 安装CMake

1. 安装:
  1. sudo apt install cmake
复制代码
1. 校验:
  1. cmake --version
复制代码
2.3. macOS

2.3.1. clang的安装

macOS下,我们可以通过安装Xcode下令行工具来安装clang,因为Xcode下令行工具中包含了clang。
2.3.2. 为什么gcc的版本号显示的是Clang version?

Xcode下令行工具安装完后,就已经包含gcc/g++工具了,我们可以检察一下其版本号
  1. ➜  ~ gcc --versionApple Clang version 15.0.0 (Clang-1500.3.9.4)
  2. Target: x86_64-apple-darwin23.5.0
  3. Thread model: posix
  4. InstalledDir: /Library/Developer/CommandLineTools/usr/bin➜  ~ g++ --versionApple Clang version 15.0.0 (Clang-1500.3.9.4)
  5. Target: x86_64-apple-darwin23.5.0
  6. Thread model: posix
  7. InstalledDir: /Library/Developer/CommandLineTools/usr/bin
复制代码
你有没有发现一个奇怪的征象:我们要检察的是gcc/g++的版本号,这里显示的版本号为什么是Apple Clang version XXX?
个人的理解: 这里的gcc/g++已经不是GNU Compiler Collection中的gcc/g++了, 某种意义上讲,他大概是 Clang/clang++ 的一个别名,底层的实现大概都换了,只是在接口上他做到了与GCC兼容。因为 Clang 设计的初衷就是为了逾越和取代GCC的。
2.3.3. gcc的安装

如果你想独立安装GNU Compiler Collection,而不是XCode自带的gcc/g++,要怎样操纵?
  1. brew install gcc
复制代码
  1. ➜  ~ ls -l /usr/local/bin | grep g++
  2. lrwxr-xr-x  1 spencer  admin      33  8  2 17:08 g++-14 -> ../Cellar/gcc/14.1.0_2/bin/g++-14
  3. lrwxr-xr-x  1 spencer  admin      55  8  2 17:08 x86_64-apple-darwin23-g++-14 -> ../Cellar/gcc/14.1.0_2/bin/x86_64-apple-darwin23-g++-14
  4. ➜  ~
  5. ➜  ~ g++-14 --version
  6. g++-14 (Homebrew GCC 14.1.0_2) 14.1.0
  7. Copyright (C) 2024 Free Software Foundation, Inc.
  8. This is free software; see the source for copying conditions.  There is NO
  9. warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
复制代码
说明我们的GCC安装成功,安装的版本是:14.1.0。可以用同样的方式查找gcc。
在~/.bash_profile 文件添加如下内容:
  1. alias gcc='gcc-14'
  2. alias cc='gcc-14'
  3. alias g++='g++-14'
  4. alias c++='c++-14'
复制代码
如果你用的是zsh,则在~/.zshrc文件中添加。
  1. # bash
  2. source ~/.bash_profile
  3. # zsh
  4. source ~/.zshrc
复制代码
  1. ➜  ~ gcc --version
  2. gcc-14 (Homebrew GCC 14.1.0_2) 14.1.0
  3. Copyright (C) 2024 Free Software Foundation, Inc.
  4. This is free software; see the source for copying conditions.  There is NO
  5. warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  6. ➜  ~ g++ --version
  7. g++-14 (Homebrew GCC 14.1.0_2) 14.1.0
  8. Copyright (C) 2024 Free Software Foundation, Inc.
  9. This is free software; see the source for copying conditions.  There is NO
  10. warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
复制代码
可以看到现在版本号不再显示Apple Clang version XXX了。
3. 验证编译器是否安装正常

3.1. 写一个测试Demo

[code]#include int main(){    std::cout




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4