当前位置: 首页 > news >正文

C/C++常用编译工具链:GCC,Clang

目录

GNU Compiler Collection

GCC的优势

编译产生的中间文件

 

Clang

Clang的特点

什么是LLVM?

Clang编译过程中产生的中间表示文件 

关于Clang的调试


C++ 编译工具链中有几个主要的编译工具,包括:        

  • GNU Compiler Collection (GCC)
  • Clang
  • Microsoft Visual C++
  • Intel C++ Compiler

        这里主要来聊聊常用的GCCClang


GNU Compiler Collection

        GNU Compiler Collection 是一个由 GNU 项目开发的编译器套件,包括 C、C++、Objective-C、Fortran 等语言的编译器。它包括预处理器、编译器、汇编器和链接器等工具

        最新的标准包包括 C、C++、Object-C、Objective-C++、Fortran、Ada、Go 和 D的编译器,以及它们的包括库。 在版本 7 之前,还支持 Java。可以在许多不同的操作系统上运行,包括 Linux、Unix、Windows 等。

GCC的优势

  • 广泛支持: GCC 有着广泛的平台和语言支持,是一个多用途的编译器集合,可以满足不同语言的编译需求,且适用于许多不同的架构和操作系统。

  • 成熟的优化: 在一些情况下,GCC 的优化能力可能比 Clang 更好,尤其是针对一些特定的架构。

  • 标准兼容性: 由于 GCC 的历史悠久,它在符合各种语言标准方面有着丰富的经验和成熟的实现。

  • 开源和社区支持: GCC 是一个开源项目,拥有庞大的社区支持,这意味着它可以根据用户的需求进行定制和扩展,同时可以从社区中获取支持和反馈。

  • 丰富的工具链: GCC 提供了丰富的工具链,包括调试器(GDB)、性能分析工具(gprof)、代码分析工具等,这些工具可以帮助开发人员进行程序开发、调试和优化。

以下是一些常用的 GCC 命令,包括编译 C 程序、C++ 程序,生成调试信息,指定优化级别等:

# 编译 C 程序
gcc -o output_file input_file.c# 编译 C++ 程序
g++ -o output_file input_file.cpp# 生成调试信息
gcc -g -o output_file input_file.c# 指定 C 标准版本
gcc -std=c11 -o output_file input_file.c# 指定 C++ 标准版本
g++ -std=c++11 -o output_file input_file.cpp# 生成汇编代码
gcc -S -o output_file.s input_file.c# 生成目标文件
gcc -c -o output_file.o input_file.c# 指定优化级别
gcc -O3 -o output_file input_file.c# 静态分析
gcc --analyze input_file.c# 指定头文件搜索路径
gcc -I/path/to/include -o output_file input_file.c# 指定库文件搜索路径
gcc -L/path/to/lib -o output_file input_file.c# 链接库文件
gcc -o output_file input_file.c -lmylibrary

编译产生的中间文件

        GCC 生成的中间文件包括汇编代码文件(.s)、目标文件(.o)、预处理文件(.i)等

GCC 的中间文件中的汇编代码文件是以特定的汇编语言形式表示源代码的中间状态,目标文件则包含了机器代码的中间表示形式。

        GCC 的中间文件则更多地依赖于 GCC 自身的优化和代码生成能力。

 

Clang

        Clang 是一个由苹果公司开发的 C、C++、Objective-C 和 Objective-C++ 编程语言的编译器前端,它支持大部分 C++11 和 C++14 的特性,并且被设计成更加模块化和易于扩展。

Clang的特点

  • Clang 以其快速的编译速度而闻名。相比于 GCC,Clang 在大型项目的编译速度上有明显的优势。

  • Clang 提供了更好的诊断能力,它能够生成更加详细和易于理解的错误和警告信息,这有助于开发者更快地发现和修复代码中的问题。

  • Clang 对于 C++11 和 C++14 标准的支持非常好,这使得开发者能够充分利用这些新标准提供的特性。

  • Clang 可以在多个平台上运行,包括 macOS、Linux 和 Windows。

  • Clang 的设计非常模块化,这使得它更容易被集成到其他软件中,也使得它更容易被其他开发者扩展和改进。

        Clang本身性能优异,其生成的AST所耗用掉的内存仅仅是GCC的20%左右。测试证明Clang编译Objective-C代码时速度为GCC的3倍,还能针对用户发生的编译错误准确地给出建议。Clang 诊断非常完善,并且具有许多功能。

        使用 Clang 编译器必须依赖于 LLVM。Clang 作为 LLVM 项目的一部分,它的工作流程中需要将生成的中间表示(IR)传递给 LLVM 核心进行优化和代码生成。因此,在使用 Clang 编译器时,需要同时安装 LLVM,以便完成整个编译流程

什么是LLVM?

        LLVM(Low Level Virtual Machine)是一个开源的编译器基础设施项目,和GNU一样,它也是一个跨平台的编译器和工具链。由苹果公司在2000年发起的,最初的目标是创建一个可以用于苹果公司内部开发的编译器基础设施。后来,LLVM逐渐发展成为一个独立的开源项目,目前已经成为一个非常流行的编译器基础设施。

        在性能和功能上,两者都有自己的优势和劣势。GCC在某些方面可能更成熟和稳定,而LLVM则可能在某些方面更快更灵活

        当你安装 Clang 时,通常会自动包含 LLVM 核心,因为 Clang 依赖于 LLVM。这使得 Clang 和 LLVM 成为一个完整的编译器基础设施,为用户提供了强大的编译和优化能力。

        Clang 命令行选项与 GCC 等其他编译器有些相似,但也有一些自己独特的命令和选项。以下是一些常用的 Clang 编译命令及其选项(clang的命令与gcc基本是一样的):

# 编译 C 程序
clang -o output_file input_file.c# 编译 C++ 程序
clang++ -o output_file input_file.cpp# 生成调试信息
clang -g -o output_file input_file.c# 指定 C++ 标准版本
clang++ -std=c++11 -o output_file input_file.cpp# 生成汇编代码
clang -S -o output_file.s input_file.c# 生成 LLVM IR(中间表示)
clang -emit-llvm -o output_file.bc input_file.c# 指定优化级别
clang -O3 -o output_file input_file.c# 静态分析
clang --analyze input_file.c# 指定头文件搜索路径
clang -I/path/to/include -o output_file input_file.c# 指定库文件搜索路径
clang -L/path/to/lib -o output_file input_file.c# 链接库文件
clang -o output_file input_file.c -lmylibrary

Clang编译过程中产生的中间表示文件 

        当使用 Clang 编译源代码时,可以选择生成 LLVM IR 文件作为中间表示。LLVM IR 是一种低级的、静态单赋值(SSA)形式的中间表示,它是 LLVM 编译器框架的核心。

clang -emit-llvm -o output_file.bc input_file.c #生成中间文件

中间表示文件的特点:

  • 类似于汇编语言,但具有高级语言的特性,如类型推断、高级数据结构等。

  • LLVM IR 是一种高度抽象的表示形式,它捕捉了源代码的基本结构和操作,但不涉及特定的机器细节。

  • LLVM IR 是与机器无关的,可以在多种架构上进行优化和代码生成。

  • LLVM IR 提供了丰富的信息和结构,使得编译器可以进行各种优化,例如常量传播、死代码消除、循环优化等。

  • 能够被 LLVM 工具链所处理,从而获得 LLVM 提供的丰富优化和分析能力。

        对于 LLVM IR 文件,通常使用的后缀名是 .ll。因此,当使用 Clang 生成 LLVM IR 文件时,通常会将输出文件命名为 output.ll。这个后缀名表示该文件包含 LLVM IR 代码。

以下是一个简单的 C 语言函数的示例及其对应的 LLVM IR 代码:

//C代码
int add(int a, int b) {return a + b;
}

对应的 LLVM IR 代码:

define i32 @add(i32 %a, i32 %b) {
entry:%add = add nsw i32 %a, %bret i32 %add
}

 让我们逐行简单解释下这段代码:

  • define i32 @add(i32 %a, i32 %b) {:这一行定义了一个名为 "add" 的函数,它接受两个 i32 类型的参数 %a%b

  • entry::这一行表示接下来的代码段是该函数的入口点。

  • %add = add nsw i32 %a, %b:这一行表示将 %a%b 相加,并将结果存储在 %add 中。add 是 LLVM IR 中的指令,它表示执行加法操作。nsw 表示“no signed wrap”,表示在执行加法时不考虑溢出。

  • ret i32 %add:这一行表示从函数中返回 %add 的值。

关于Clang的调试

  • Clang 生成的可执行文件可以使用多种调试器进行调试,包括 GDB(GNU 调试器)和 LLDB(LLVM 调试器)。LLDB 是 LLVM 项目的一部分,因此与 Clang 更加紧密相关。

  • 使用 LLDB 进行调试时,可以在命令行中输入 lldb 可执行文件名 来启动 LLDB 调试器。然后可以使用 LLDB 提供的命令来进行调试。

Clang相关传送门

《Clang用户手册》icon-default.png?t=O83Ahttps://clang.llvm.org/docs/UsersManual.htmlLLVM 下载页面icon-default.png?t=O83Ahttps://releases.llvm.org/download.htmlClang - C++ 编程语言状态icon-default.png?t=O83Ahttps://clang.llvm.org/cxx_status.html


相关文章:

C/C++常用编译工具链:GCC,Clang

目录 GNU Compiler Collection GCC的优势 编译产生的中间文件 Clang Clang的特点 什么是LLVM? Clang编译过程中产生的中间表示文件 关于Clang的调试 C 编译工具链中有几个主要的编译工具,包括: GNU Compiler Collection (GCC…...

let和war的区别

let和war的区别 看不懂图片,可以看视频教程...

[CUDA] stream使用笔记

文章目录 1. stream一般用法2. stream与event:3. stream异常的排查4. stream的异步与同步行为 1. stream一般用法 cudaStream_t stream_; cudaStreamCreate(&stream_); // create stream // some operators running on this stream_ cudaStreamSynchronize(str…...

第二课:开发工具

在本课中,我们将介绍一些常用的C开发工具,并附上下载链接,帮助你选择合适的工具进行开发。 1. DEVC DEVC 是一个轻量级的C开发工具,适合初学者使用。它提供了基本的代码编辑、编译和调试功能。 下载链接: DEVC 下载 2. Visual…...

Vue 学习随笔系列十三 -- ElementUI 表格合并单元格

ElementUI 表格合并单元格 文章目录 ElementUI 表格合并单元格[TOC](文章目录)一、表头合并二、单元格合并1、示例代码2、示例效果 一、表头合并 参考&#xff1a; https://www.jianshu.com/p/2befeb356a31 二、单元格合并 1、示例代码 <template><div><el-…...

对于一个含有直流和交流分量的信号,如何使用示波器正确显示并测出直流电压值和交流电压峰峰值?

对于一个含有直流&#xff08;DC&#xff09;和交流&#xff08;AC&#xff09;分量的混合信号&#xff0c;使用示波器来正确显示和测量其直流电压值和交流电压峰峰值需要选择适当的设置和方法。以下是详细的步骤&#xff1a; 所需设备 示波器电压探头 步骤一&#xff1a;连…...

移动混合开发面试题及参考答案

目录 什么是混合开发(Hybrid App)? 混合开发(Hybrid App)与原生开发相比有什么优缺点? 优点 缺点 混合开发(Hybrid App)的兴起原因是什么? 市场竞争和成本控制需求 技术发展和资源整合 人才资源的考量 Web App、Native App 和混合开发(Hybrid App)的区别是…...

命令行工具开发秘籍:从零开始创建实用Python脚本(如何创建Python命令行工具)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 文章内容 📒📝 创建命令行工具的基础🔖 在非模块化的环境中🔖 在模块化环境中📝 打包和安装模块📝 使用命令行工具⚓️ 相关链接 ⚓️📖 介绍 📖 如何将自己的Python模块打包成一个可在命令行中直接执行的工具?…...

Python - PDF 分割成单页、PDF 转图片(PNG)

文章目录 PDF 分割成一页页的 PDFPDF 转 PNGPDF 分割成一页页的 PDF import fitz def split_pdf(pdf_path, save_dir):source_pdf = fitz.open(pdf_path)# 遍历source_pdf中的每一页,page_number从0开始计数 for idx...

【网络】套接字编程——TCP通信

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;TCP网络服务器简单模拟实现。 > 毒鸡汤&#xff1a;有些事情&#xff0c;总是不明白&#xff0c;所以我不会坚持。早安! > 专栏选自&#xff1a;…...

PyTorch实践-CNN-验证码识别

1 需求 GitHub - xhh890921/cnn-captcha-pytorch: 小黑黑讲AI&#xff0c;AI实战项目《验证码识别》 2 接口 含义 在optim.Adam接口中&#xff0c;lr参数代表学习率&#xff08;Learning Rate&#xff09;。学习率是优化算法中的一个关键超参数&#xff0c;它决定了在每次迭代…...

json和pb的比较

1.介绍 在数据序列化和通信领域&#xff0c;schema 指的是用于定义数据结构的模式或结构描述。它描述了数据的字段、类型、嵌套结构和约束&#xff0c;并在数据验证和解释上发挥重要作用。常见的 schema 格式包括 Protocol Buffers (proto)、JSON Schema、XML Schema 等。 Pr…...

Redis-基本了解

一、Redis 初识 Redis 是⼀种基于键值对&#xff08;key-value&#xff09;的NoSQL数据库&#xff0c;与很多键值对数据库不同的是&#xff0c;Redis 中的值可以是由string&#xff08;字符串&#xff09;、hash&#xff08;哈希&#xff09;、list&#xff08;列表&#xff09…...

HarmonyOS第一课 06 构建更加丰富的页面-习题解析

判断题 1. Tabs组件可以通过接口传入一个TabsController&#xff0c;该TabsController可以控制Tabs组件进行页签切换。T 正确(True) 错误(False) 使用 this.tabsController.changeIndex(this.currentIndex); 可以切换页签 WebviewController提供了变更Web组件显示内容的接口…...

计算机的错误计算(一百四十三)

摘要 探讨 MATLAB 中 附近数的余弦函数的计算精度问题。 例1. 已知 计算 与 直接贴图吧&#xff1a; 另外&#xff0c;16位的正确值分别为 -0.3012758451921695e-7 与 -0.3765996542384011e-10&#xff08;ISRealsoft 提供&#xff09;。 容易看出&#xff0c;MATLAB的输…...

大数据之——Window电脑本地配置hadoop系统(100%包避坑!!方便日常测试,不用再去虚拟机那么麻烦)

之前我们的hadoop不管是伪分布式还是分布式&#xff0c;都是配置在虚拟机上&#xff0c;我们有的时候想要运行一些mapreduce、hdfs的操作&#xff0c;又要把文件移到虚拟机&#xff0c;又要上传hdfs&#xff0c;麻烦得要死&#xff0c;那么有的时候我们写的一些java、python的h…...

汽车固态电池深度报告

固态电池符合未来大容量二次电池发展方向&#xff0c;半固态电池已装车&#xff0c;高端长续航车型、e-VTOL 等方向对固态电池需求明确。固态电池理论上具备更高的能量密度、更好的热稳定性、更长的循环寿命等优点&#xff0c;是未来大容量二次电池发展方向。根据中国汽车动力…...

HTB-Cicada 靶机笔记

Cicada 靶机笔记 概述 HTB 的靶机 Cicada 靶机 靶机地址&#xff1a;https://app.hackthebox.com/machines/Cicada 很有意思且简单的 windows 靶机&#xff0c;这台靶机多次利用了信息枚举&#xff0c;利用不同的信息一步一步获得 root 权限 一、nmap 扫描 1&#xff09;…...

使用DJL和PaddlePaddle的口罩检测详细指南

使用DJL和PaddlePaddle的口罩检测详细指南 完整代码 该项目利用DJL和PaddlePaddle的预训练模型&#xff0c;构建了一个口罩检测应用程序。该应用能够在图片中检测人脸&#xff0c;并将每张人脸分类为“戴口罩”或“未戴口罩”。我们将深入分析代码的每个部分&#xff0c;以便…...

基于stm32的多旋翼无人机(Multi-rotor UAV based on stm32)

在现代无人机技术中&#xff0c;多旋翼无人机因其稳定性和操控性而受到广泛应用。STM32微控制器因其强大的处理能力和丰富的外设接口&#xff0c;成为实现多旋翼无人机控制的理想选择。本文将详细介绍如何基于STM32实现多旋翼无人机的控制&#xff0c;包括硬件设计、软件设计和…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

idea大量爆红问题解决

问题描述 在学习和工作中&#xff0c;idea是程序员不可缺少的一个工具&#xff0c;但是突然在有些时候就会出现大量爆红的问题&#xff0c;发现无法跳转&#xff0c;无论是关机重启或者是替换root都无法解决 就是如上所展示的问题&#xff0c;但是程序依然可以启动。 问题解决…...

【Python】 -- 趣味代码 - 小恐龙游戏

文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系&#xff0c;主要是分成几个表&#xff0c;用户表我们是记录用户的基础信息&#xff0c;包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题&#xff0c;不同的角色&#xf…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的&#xff0c;根据Excel列的需求预估的工时直接打骨折&#xff0c;不要问我为什么&#xff0c;主要…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

selenium学习实战【Python爬虫】

selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

算法:模拟

1.替换所有的问号 1576. 替换所有的问号 - 力扣&#xff08;LeetCode&#xff09; ​遍历字符串​&#xff1a;通过外层循环逐一检查每个字符。​遇到 ? 时处理​&#xff1a; 内层循环遍历小写字母&#xff08;a 到 z&#xff09;。对每个字母检查是否满足&#xff1a; ​与…...

4. TypeScript 类型推断与类型组合

一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式&#xff0c;自动确定它们的类型。 这一特性减少了显式类型注解的需要&#xff0c;在保持类型安全的同时简化了代码。通过分析上下文和初始值&#xff0c;TypeSc…...