簡體   English   中英

C++ 工具鏈和編譯器之間有什么區別?

[英]What are the differences between C++ Toolchains and Compilers?

我知道有很多編譯器,比如gccclangninja但我一直聽說“ Toolchains ”等等,但我不明白它們是什么,比如“gnu-toolchain”等

工具鏈是一組用於構建項目的工具(例如編譯器、鏈接器和匯編器)。 其他工具,例如調試器,可以與工具鏈相關聯。 根據系統上安裝的編譯器,可以有多個工具鏈可用。

我知道有很多編譯器,比如 gcc、clang、ninja

ninja 不是編譯器。 它是一個構建自動化工具,或一個“構建系統”。 構建自動化工具讀取配置,並生成必要的命令來調用構建程序所需的工具鏈的工具。

那么例如CMake是什么?

CMake 是一種配置語言,也是一種為構建自動化工具(例如 ninja)生成配置的程序。

使用此類生成器的原因是您可以選擇使用任何構建系統(由生成器支持),這很重要,因為並非所有系統都支持所有構建系統。 構建系統生成器的另一個原因是檢測系統的功能和使用的工具鏈,並使用該信息來更改配置。

C++ 工具鏈和編譯器之間有什么區別?

工具鏈是將源文件轉換為可執行文件(或庫)並執行所需的一組工具。

編譯器是工具鏈包含的工具之一。 編譯器的工作是將源文件作為參數,並為目標系統生成匯編代碼——盡管這種觀點有點過時了:通過鏈接時間優化,編譯器改為生成“中間表示”語言。

像“gnu-toolchain”

GNU 工具鏈是一組使用 GNU 編譯器(即 GCC)的工具。

那么工具鏈包含什么?

它可以取決於上下文,但以下是典型的:

翻譯階段:

  • 編譯器
  • 匯編器
  • 鏈接器

執行階段:

  • 動態加載器
  • 調試器
  • 分析器

其他工具也可被視為工具鏈的一部分,例如:

  • 構建自動化工具
  • 標准庫
  • 宏處理器
  • 檔案員
  • 包管理器

以及許多其他程序員可以使用的小工具。

有幾個重要的術語:

  1. 編譯器:將代碼轉換為已編譯二進制格式的工具。 這通常包括一個匯編程序步驟,嚴格來說,這不是真正的編譯器。 此外,您調用的工具通常是編譯器/匯編器/鏈接器后端的“驅動程序”,您可以在構建過程(包括鏈接)的每個步驟中調用它們。 例子是gcc / g++clang / clang++clicc / icpc ,...

  2. 匯編程序:將編譯器生成的二進制代碼組裝成特定的目標文件格式(Visual Studio 的 .obj 文件,其他幾乎所有內容的 .o 文件)。 當從源代碼生成目標文件時,這通常是內置的或至少由編譯器調用。 例如as ...

  3. 鏈接器:將目標文件鏈接成可執行文件格式。 這可以是共享庫 (.dll/.dylib/.so) 或可執行應用程序 (.exe)。 例如ldlinklld 、 ...

    (3a) “圖書管理員”:Unix 工具ar或 Visual Studio 工具lib.exe 這只是將目標文件捆綁成一個瘦包裝器格式 (.a/.lib)。

  4. 調試器:用於在運行時檢查源代碼中定義的變量值的工具。 例如gdblldbwindbg 、...

  5. 工具鏈:以上所有組合在一起。 調試器可能會也可能不會被視為其中的一部分。

  6. 構建工具:調用工具鏈工具將一組源文件轉換為一個或多個庫和可執行文件的工具。 例如make , ninja , msbuild , xcode-build , ...

  7. 項目生成器:獲取項目的“抽象”描述以及源文件如何與輸出文件相關,並生成構建工具和/或 IDE 可以使用的內容,就好像項目是在該 IDE 中構建的一樣。 如果做得好,這會使跨平台開發的痛苦少得多。 例如cmakeqmakepremake ,...

  8. IDE:文本編輯器增強了不同級別的語言注釋、代碼導航和工具鏈集成。 通常,您可以從一個 IDE 加載項目文件、搜索符號、構建、調試等。 示例包括 Visual Studio、Qt Creator、KDevelop、Xcode、Eclipse、Code::Blocks 等,以及適當的插件數組:Vim、Emacs、VSCode、Atom、Sublime Text 等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM