C++里面clang和g++是什么

clang和g++的分别是什么,有什么联系?

特性 g++ clang
项目归属 隶属于 GNU 项目的 GCC 隶属于 LLVM 项目
许可证 GPL(通用公共许可证) BSD(更宽松的许可证)
开发理念 以功能的稳定性和兼容性为重心,具有传统风格 追求代码模块化、现代化,保留调试灵活性,并注重扩展性
错误与警告信息 错误信息偏技术向,输出有时难以分析 清晰易读,错误和警告经过精心设计,适合开发过程的调试
编译速度 GCC 通常被认为更加稳定、较为成熟,速度比较快 Clang 编译速度有时略逊于 GCC,但改进仍在持续进行
优化性能 优化选项稳定且强大,对多种优化场景表现突出 得益于 LLVM 后端优化技术,对某些平台的性能优化更好
支持的语言 专注于传统 C/C++ 支持的语言更多,包括 Objective-C、Swift 等
  • 总体趋势:
    • g++ 是历史悠久,传统稳定的主流 C++ 编译器。
    • clang 是随着 LLVM 项目的进步而快速发展的现代化编译器,优势在于模组化、强调试友好性和更灵活的生态支持。
  • 选择的建议:
    • 如果是开发传统的 Linux 系统 C++ 工程,推荐使用 g++
    • 如果需要现代化工具支持(如更好的调试、格式化工具等)或在 macOS/iOS 平台上开发,推荐使用 clang
    • 对于新手或需要清晰调试错误信息的人,clang 更加友好。
    • 在涉及到混合编译(如 C++ 和 Swift 或 Objective-C)的工程中,clang 是更合适的选择。

命令行运行:g++ hello.cpp 或 clang++ hello.cpp

如果希望更换名字,g++ hello.cpp -o Felix就会产生一个Felix的文件(可执行文件)

然后运行这个文件命令: ./Felix

C++工作流程

阶段 输入文件 输出文件 工具/命令
预处理 example.cpp example.i g++ -E example.cpp
编译 example.i example.s g++ -S example.cpp
汇编 example.s example.o g++ -c example.cpp
链接 example.o example g++ example.o -o example
  • (预处理器preprocessor负责)预处理阶段:g++ -E example.cpp -o example.i

    • 头文件展开:#include 的头文件替换为实际的内容。(纯copy)
    • 宏替换:#define 定义的宏替换为对应的值。
    • 条件编译: 处理如 #ifdef#ifndef 的条件指令。
    • 删除注释: 从源代码中删除所有注释。
  • (编译器compiler负责)编译阶段:g++ -S example.cpp -o example.s

    • 语法分析: 检查 C++ 源代码的语法是否正确。
    • 语义分析: 检查变量、函数、类等的使用是否符合 C++ 语言规则。
    • 中间代码生成: 将代码转换为将要执行的基于目标体系结构的低级别代码。
    • 优化: 编译器可能会对代码进行优化,例如常量折叠、循环展开等。
  • 汇编/Assembly:g++ -c example.cpp -o example.o

    • 关键的汇编行为:
      • 将汇编指令(如 x86、ARM 指令)翻译成目标平台的机器码。
      • 每个源文件都会生成一个对应的目标文件(object file)。windows是.obj,Mac或者Linux是.o
  • 链接/linking:g++ example.o -o example

    • 符号解析:
      • 将不同目标文件中使用的符号(如函数和变量名)解析到正确的定义。
      • 例如,如果一个目标文件中使用了外部函数 foo(),而另一个目标文件中定义了 foo(),链接器会将它们关联。
    • 外部库链接:
      • 将程序中的库调用解析到相应的库文件,例如标准 C++ 库(libstdc++)。
      • 动态库(如 .so 文件)或静态库(如 .a 文件)都可能被链接进来。
    • 地址分配:
      • 为函数和变量生成内存地址,确保程序在运行时可以正确访问它们。
  • 最后得到可执行文件example,运行./example

一般来说现在的IDE点击运行会直接忽略中间过程,直接运行最终的可执行文件。


C++里面clang和g++是什么
https://tyfelix.com/2025/02/02/C+里面的clang和g++是什么/
Author
tyfelix
Posted on
February 2, 2025
Licensed under