C/C++开发工具链的那些事儿

本文主要介绍C/C++开发过程中可能用到的一些工具,包括:gcc、g++、clang、cl、gdb、GCC、LLVM、MinGW、MSYS、MSYS2、VS、VS Code等。

C/C++开发工具链的那些事儿_第1张图片

在C/C语言代码的编译过程中主及以下几步:

  • 预处理

  • 编译

  • 汇编

  • 链接

C/C++开发工具链的那些事儿_第2张图片

一、编译器

传统的编译器通常分为三个部分,前端(FrontEnd),优化器(Optimizer)和后端(BackEnd)。在编译过程中,前端主要负责词法和语法分析,将源代码转化为抽象语法树;优化器则是在前端的基础上,对得到的中间代码进行优化,使代码更加高效;后端则是将已经优化的中间代码转化为针对各自平台的机器代码。

GCC

GCC(GNU Compiler Collection,GNU编译器套件)是由GNU开发的编程语言编译器。GNU编译器套件包括C、C++、 Objective-C、 Fortran、Java、Ada和Go语言前端,也包括了这些语言的库(如libstdc++,libgcj等)

gcc 是 GCC 编译器的通用编译指令,因为根据程序文件的后缀名,gcc 指令可以自行判断出当前程序所用编程语言的类别,比如:

  • xxx.c:默认以编译 C 语言程序的方式编译此文件;

  • xxx.cpp:默认以编译 C++ 程序的方式编译此文件。

  • xxx.m:默认以编译 Objective-C 程序的方式编译此文件;

  • xxx.go:默认以编译 Go 语言程序的方式编译此文件;

但如果使用 g++ 指令,则无论目标文件的后缀名是什么,该指令都一律按照编译 C++ 代码的方式编译该文件。也就是说,对于 .c 文件来说,gcc 指令以 C 语言代码对待,而 g++ 指令会以 C++ 代码对待。但对于 .cpp 文件来说,gcc 和 g++ 都会以 C++ 代码的方式编译。

LLVM

LLVM是构架编译器(compiler)的框架系统,以C++编写而成,用于优化以任意程序语言编写的程序的编译时间(compile-time)、链接时间(link-time)、运行时间(run-time)以及空闲时间(idle-time),对开发者保持开放,并兼容已有脚本。
目前官方的LLVM只支持处理C/C++,Objective-C三种语言,当然也有一些非官方的扩展,使其支持ActionScript、Ada、D语言、Fortran、GLSL、Haskell、Java bytecode、Objective-C、Python、Ruby、Rust、Scala以及C#。

LLVM主要由Clang前端、IR优化器(Pass)和LLVM后端构成。其功能分别是:

  • Clang前端:将平台相关的源码生成与平台无关的IR(llvm Bitcode)

  • IR优化器:主要对IR进行优化。

  • LLVM后端:将优化后的IR转换为与平台相关的汇编代码或者机器码。

Clang 是 LLVM 的前端,可以用来编译 C,C++,ObjectiveC 等语言。Clang 则是以 LLVM 为后端的一款高效易用,并且与IDE 结合很好的编译前端。

MSVC

Microsoft Visual C++(简称Visual C++、MSVC、VS或VC)是微软公司的免费C++开发工具,具有集成开发环境,可提供编辑C语言,C++以及C++/CLI等编程语言。VC++集成了便利的除错工具,特别是集成了微软Windows视窗操作系统应用程序接口(Windows API)、三维动画DirectX API,Microsoft .NET框架。

MinGW(Minimalist GNUfor Windows),它是一个可自由使用和自由发布的Windows特定头文件和使用GNU工具集导入库的集合,允许你在Windows平台生成本地的Windows程序而不需要第三方C运行时(C Runtime)库。运行时库:支持程序运行的基本函数的集合,一般是静态库lib或动态库dll。

而MSVC,就是上文所说的第三方C运行时库:由微软开发的VC运行时库,被Visual Studio IDE所集成。所以我们使用VS时会附带MSVC编译器。MSVC编译器工具链主要由cl.exe与link.exe构成,其中:

  • cl.exe用于控制在 Microsoft C/C++的编译器和链接器

  • link.exe 将通用对象文件格式 (COFF) 对象文件和库链接起来,以创建可执行 (.exe) 文件或动态链接库 (DLL)

用户只需要调用cl.exe,即可完成编译-链接全过程。Microsoft官方介绍:cl.exe的命令行语法


参考链接:

详解三大编译器:gcc、llvm 和 clang - 自由技艺的文章 - 知乎

GCC编译器30分钟入门教程 - C语言中文网

深入浅出让你理解什么是LLVM - 简书

MSVC编译器介绍 - CSDN

二、构建系统

构建系统(build system)是用来从源代码生成用户可以使用的目标(targets)的自动化工具。目标可以包括库、可执行文件、或者生成的脚本等等。
构建系统的需求是随着软件规模的增大而提出的。如果只是做软件编程训练,通常代码量比较小,编写的源代码只有几个文件。比如你编写了一段代码放入helloworld.c文件中,要编译这段代码,只需要执行以下命令:gcc helloworld.c
当软件规模逐渐增加,这时可能有几十个源代码文件,而且有了模块划分,有的要编译成静态库,有的要编译成动态库,最后链接成可执行代码,这时命令行方式就捉襟见肘,需要一个构建系统。常见的构建系统有GNU Make。需要注意的是, 构建系统并不是取代gcc这样的工具链,而是定义编译规则,最终还是会调用工具链编译代码。
当软件规模进一步扩大,特别是有多平台支持需求的时候,编写GNU Makefile将是一件繁琐和乏味的事情,而且极容易出错。这时就出现了生成Makefile的工具,比如CMake、AutoMake等等,这种构建系统称作元构建系统(Meta-Build System)。

Make

make 是一个命令工具,它解释 Makefile 中的规则。在 Makefile 文件中描述了整个工程所有文件的编译顺序、编译规则。Makefile 有自己的书写格式、关键字、函数。而且在 Makefile 中可以使用系统 shell 所提供的任何命令来完成想要的工作。Makefile 在绝大多数的 IDE 开发环境中都在使用,已经成为一种工程的编译方法。

Ninja

Ninja 是借由 Google Chrome 项目而诞生的一个构建工具,它的诞生目标是为了速度,最初是为了对Chromium、Swift等进行快速编译构建,用来替代GNU Make。换句话说,在 Google Chrome 项目的开发过程中,开发者们认为同类型的其它构建工具不给力,所以才会考虑重新开发更高效的工具。

GYP、CMake和Meson支持生成Ninja构建文件。

Nmake

nmake是Microsoft Visual Studio中的附带命令,需要安装VS,实际上相当于linux的make

Cmake

CMake是一个跨平台的元构建系统工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。只是 CMake 的组态档取名为 CMakeLists.txt。Cmake 并不直接建构出最终的软件,而是产生标准的建构档(如 Unix 的 Makefile 或 Windows Visual C++ 的 projects/workspaces),然后再依一般的建构方式使用。这使得熟悉某个集成开发环境(IDE)的开发者可以用标准的方式建构他的软件,这种可以使用各平台的原生建构系统的能力是 CMake 和 SCons 等其他类似系统的区别之处。

特点:

  • 支持多种语言,例如:C、C++、Java、Python等

  • 支持多种Build Backend,例如:Make,Ninjia,Visual Studio,Xcode等

GN

GN是一个生成Ninja构建文件的元构建系统,以便你可以用Ninja构建你的项目。

Meson

Meson 是用于自动化构建的自由软件,使用Python语言编写,在 Apache 许可证 2.0版本下发布,主要目标是为了让开发者节约用于配置构建系统的时间。

特点:

  • 对 Linux、macOS、Windows、GCC、Clang、Visual Studio 等的多平台支持

  • 支持的语言包括 C、C++、D、Fortran、Java、Rust

  • 在可读性和用户友好的非图灵完备 DSL 中构建定义

  • 许多操作系统和裸机的交叉编译

  • 在不牺牲正确性的情况下针对极快的完整和增量构建进行了优化

  • 与发行包一起工作的内置多平台依赖提供程序

Xmake

Xmake是国人开发的一个基于Lua的轻量级跨平台C/C++自动构建工具。xmake可以直接生成编译规则然后再调用编译器执行编译,它还有一个包管理器Xrepo,可直接安装某些C/C+库。

本节参考链接:https://zhuanlan.zhihu.com/p/570846866

三、IDE

集成开发环境(IDE,Integrated Development Environment )是用于提供程序开发环境的应用程序,一般包括代码编辑器、编译器、调试器和图形用户界面等工具。集成了代码编写功能、分析功能、编译功能、调试功能等一体化的开发软件服务套。所有具备这一特性的软件或者软件套(组)都可以叫集成开发环境。如微软的Visual Studio系列,Borland的C++ Builder、Delphi系列等。该程序可以独立运行,也可以和其它程序并用。

C语言的集成开发环境有:

  • Visual Studio 2022(简称 VS2022)

  • CLion

  • Dev C++

  • Visual C++ 6.0(简称 VC 6.0)

  • Code::Blocks

  • Turbo C 2.0

  • C-Free 5.0

  • Xcode(Mac OS平台)

VS

VS一般指Visual Studio xxx,其最新版本为Visual Studio 2022

Visual Studio 是一个出色的IDE,可用于构建适用于Windows、Mac、Linux、iOS 和Android 的丰富、精美的跨平台应用程序。 使用一系列技术(例如WinForms、WPF、WinUI、MAUI 或Xamarin)构建丰富的客户端应用。

VS Code

Visual Studio Code(简称“VS Code”)是Microsoft在2015年4月30日Build开发者大会上正式宣布一个运行于 Mac OS X、Windows和 Linux 之上的,针对于编写现代Web和云应用的跨平台源代码编辑器, [2] 可在桌面上运行,并且可用于Windows,macOS和Linux。它具有对JavaScript,TypeScript和Node.js的内置支持,并具有丰富的其他语言(例如C++,C#,Java,Python,PHP,Go)和运行时(例如.NET和Unity)扩展的生态系统。

VS Code仅仅是一个代码编辑器,如果你需要进行代码的调试运行,需要安装相应的插件并配置对应语言的编译器,例如C语言可以配置GCC编译器。

四、其他工具

MinGW

MinGW,是Minimalist GNU for Windows的缩写。它是一个可自由使用和自由发布的Windows特定头文件和使用GNU工具集导入库的集合,允许你在GNU/Linux和Windows平台生成本地的Windows程序而不需要第三方C运行时(C Runtime)库。MinGW 是一组包含文件和端口库,其功能是允许控制台模式的程序使用微软的标准C运行时(C Runtime)库(MSVCRT.DLL),该库在所有的 NT OS 上有效,在所有的 Windows 95发行版以上的 Windows OS 有效,使用基本运行时,你可以使用 GCC 写控制台模式的符合美国标准化组织(ANSI)程序,可以使用微软提供的 C 运行时(C Runtime)扩展,与基本运行时相结合,就可以有充分的权利既使用 CRT(C Runtime)又使用 WindowsAPI功能。

MSYS

Minimal GNU(POSIX)system on Windows,是一个小型的GNU环境,包括基本的bash,make等等。与Cygwin大致相当。

MSYS2

MSYS2 (Minimal SYStem 2) 是一个MSYS的独立改写版本,主要用于 shell 命令行开发环境。同时它也是一个在Cygwin (POSIX 兼容性层) 和 MinGW-w64(从"MinGW-生成")基础上产生的,追求更好的互操作性的 Windows 软件。相比MSYS有个更优秀的包管理器 pacman。

官网地址:https://www.msys2.org/


参考文献:

https://blog.csdn.net/SeaBiscuitUncle/article/details/126555431

https://www.cnblogs.com/knife-king/p/11090029.html

https://www.bilibili.com/read/cv18397621

https://blog.csdn.net/LaineGates/article/details/129336169

https://xie.infoq.cn/article/7ef2500ca920b61c181b060a0

你可能感兴趣的:(#,C++,C/C++,vscode)