C++ 工具链和编译器之间有什么区别?

What are the differences between C++ Toolchains and Compilers?

我知道有很多编译器,例如 gccclangninja,但我一直听说“Toolchains”等等,但我不明白它们是什么,例如“gnu-toolchain”等

工具链是一组用于构建项目的工具(例如编译器、链接器和汇编器)。其他工具(例如调试器)可以与工具链相关联。可能有多个工具链可用,具体取决于您系统上安装的编译器。

I know there are many compilers like gcc, clang, ninja

ninja 不是编译器。它是一个构建自动化工具,或者说 "build system"。构建自动化工具读取配置,并生成必要的命令来调用构建程序所需的工具链工具。

So for example CMake is what?

CMake 是一种配置语言,也是一种为构建自动化工具(例如 ninja)生成配置的程序。

使用此类生成器的原因是您可以选择使用任何构建系统(生成器支持),这很重要,因为并非所有系统都支持所有构建系统。构建系统生成器的另一个原因是检测系统的功能和使用的工具链,并使用该信息更改配置。

What are the differences between C++ Toolchains and Compilers?

工具链是将源文件转换为可执行文件(或库)并执行所需的一组工具。

编译器是工具链包含的工具之一。编译器的工作是将源文件作为参数,并为目标系统生成汇编代码——尽管这种观点有点过时了:使用 link 时间优化,编译器生成 "intermediate representation"语言。

like "gnu-toolchain'

GNU 工具链是一组使用 GNU 编译器(即 GCC)的工具。

So what does the Toolchain containt?

这可能取决于上下文,但以下是典型的:

翻译阶段:

  • 编译器
  • 汇编程序
  • link呃

执行阶段:

  • 动态加载程序
  • 调试器
  • 探查器

其他工具也可被视为工具链的一部分,例如:

  • 构建自动化工具
  • 标准库
  • 宏处理器
  • 存档器
  • 包管理器

以及程序员可以使用的许多其他小工具。

有几个重要的术语:

  1. 编译器:将代码转换为已编译二进制格式的工具。这通常包括一个汇编程序步骤,严格来说这不是真正的编译器。此外,您调用的工具通常是 "drivers" 用于 compiler/assembler/linker 后端,并且您在构建过程(包括链接)的每个步骤中调用它们。例如 gcc/g++clang/clang++clicc/icpc、...

  2. 汇编程序:将编译器生成的二进制代码汇编成特定的目标文件格式([=77= 的 .obj 文件,几乎所有其他文件的 .o 文件)。这通常是内置的,或者至少在从源代码生成目标文件时由编译器调用。例如。 as, ...

  3. 链接器:将目标文件链接在一起成为可执行文件格式。这可以是共享库 (.dll/.dylib/.so) 或可执行应用程序 (.exe)。例如 ldlinklld、...

    (3a) "Librarian":Unix 工具 ar 或 Visual studio 工具 lib.exe。这只是将目标文件捆绑在一起成为一个薄包装格式 (.a/.lib)。

  4. 调试器:用于在运行时检查源代码中定义的变量值的工具。例如 gdblldbwindbg、...

  5. 工具链:以上所有组合在一起。不过,调试器可能会或可能不会被视为其中的一部分。

  6. 构建工具:调用工具链工具将一组源文件转换为一个或多个库和可执行文件的工具。例如。 makeninjamsbuildxcode-build、...

  7. 项目生成器:获取项目的 "abstract" 描述以及源文件与输出文件的关系,并生成一些构建工具 and/or IDE可以像项目是在那个 IDE 里面建立的一样使用。如果做得好,这会大大减少跨平台开发的痛苦。例如 cmakeqmakepremake、...

  8. IDE:文本编辑器增强了不同级别的语言注释、代码导航和工具链集成。通常,您可以加载项目文件、搜索符号、构建、调试等,全部来自一个 IDE。示例是 Visual Studio、Qt Creator、KDevelop、Xcode、Eclipse、Code::Blocks、...以及适当的插件阵列:Vim、Emacs、VSCode , 原子, Sublime 文本, ...