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
这里主要来聊聊常用的GCC与Clang。
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用户手册》
https://clang.llvm.org/docs/UsersManual.htmlLLVM 下载页面
https://releases.llvm.org/download.htmlClang - C++ 编程语言状态
https://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、示例效果 一、表头合并 参考: https://www.jianshu.com/p/2befeb356a31 二、单元格合并 1、示例代码 <template><div><el-…...

对于一个含有直流和交流分量的信号,如何使用示波器正确显示并测出直流电压值和交流电压峰峰值?
对于一个含有直流(DC)和交流(AC)分量的混合信号,使用示波器来正确显示和测量其直流电压值和交流电压峰峰值需要选择适当的设置和方法。以下是详细的步骤: 所需设备 示波器电压探头 步骤一:连…...
移动混合开发面试题及参考答案
目录 什么是混合开发(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通信
> 作者:დ旧言~ > 座右铭:松树千年终是朽,槿花一日自为荣。 > 目标:TCP网络服务器简单模拟实现。 > 毒鸡汤:有些事情,总是不明白,所以我不会坚持。早安! > 专栏选自:…...
PyTorch实践-CNN-验证码识别
1 需求 GitHub - xhh890921/cnn-captcha-pytorch: 小黑黑讲AI,AI实战项目《验证码识别》 2 接口 含义 在optim.Adam接口中,lr参数代表学习率(Learning Rate)。学习率是优化算法中的一个关键超参数,它决定了在每次迭代…...
json和pb的比较
1.介绍 在数据序列化和通信领域,schema 指的是用于定义数据结构的模式或结构描述。它描述了数据的字段、类型、嵌套结构和约束,并在数据验证和解释上发挥重要作用。常见的 schema 格式包括 Protocol Buffers (proto)、JSON Schema、XML Schema 等。 Pr…...

Redis-基本了解
一、Redis 初识 Redis 是⼀种基于键值对(key-value)的NoSQL数据库,与很多键值对数据库不同的是,Redis 中的值可以是由string(字符串)、hash(哈希)、list(列表)…...

HarmonyOS第一课 06 构建更加丰富的页面-习题解析
判断题 1. Tabs组件可以通过接口传入一个TabsController,该TabsController可以控制Tabs组件进行页签切换。T 正确(True) 错误(False) 使用 this.tabsController.changeIndex(this.currentIndex); 可以切换页签 WebviewController提供了变更Web组件显示内容的接口…...

计算机的错误计算(一百四十三)
摘要 探讨 MATLAB 中 附近数的余弦函数的计算精度问题。 例1. 已知 计算 与 直接贴图吧: 另外,16位的正确值分别为 -0.3012758451921695e-7 与 -0.3765996542384011e-10(ISRealsoft 提供)。 容易看出,MATLAB的输…...

大数据之——Window电脑本地配置hadoop系统(100%包避坑!!方便日常测试,不用再去虚拟机那么麻烦)
之前我们的hadoop不管是伪分布式还是分布式,都是配置在虚拟机上,我们有的时候想要运行一些mapreduce、hdfs的操作,又要把文件移到虚拟机,又要上传hdfs,麻烦得要死,那么有的时候我们写的一些java、python的h…...

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

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

使用DJL和PaddlePaddle的口罩检测详细指南
使用DJL和PaddlePaddle的口罩检测详细指南 完整代码 该项目利用DJL和PaddlePaddle的预训练模型,构建了一个口罩检测应用程序。该应用能够在图片中检测人脸,并将每张人脸分类为“戴口罩”或“未戴口罩”。我们将深入分析代码的每个部分,以便…...
基于stm32的多旋翼无人机(Multi-rotor UAV based on stm32)
在现代无人机技术中,多旋翼无人机因其稳定性和操控性而受到广泛应用。STM32微控制器因其强大的处理能力和丰富的外设接口,成为实现多旋翼无人机控制的理想选择。本文将详细介绍如何基于STM32实现多旋翼无人机的控制,包括硬件设计、软件设计和…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...
go 里面的指针
指针 在 Go 中,指针(pointer)是一个变量的内存地址,就像 C 语言那样: a : 10 p : &a // p 是一个指向 a 的指针 fmt.Println(*p) // 输出 10,通过指针解引用• &a 表示获取变量 a 的地址 p 表示…...

nnUNet V2修改网络——暴力替换网络为UNet++
更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...

MyBatis中关于缓存的理解
MyBatis缓存 MyBatis系统当中默认定义两级缓存:一级缓存、二级缓存 默认情况下,只有一级缓存开启(sqlSession级别的缓存)二级缓存需要手动开启配置,需要局域namespace级别的缓存 一级缓存(本地缓存&#…...
Spring Security 认证流程——补充
一、认证流程概述 Spring Security 的认证流程基于 过滤器链(Filter Chain),核心组件包括 UsernamePasswordAuthenticationFilter、AuthenticationManager、UserDetailsService 等。整个流程可分为以下步骤: 用户提交登录请求拦…...
c# 局部函数 定义、功能与示例
C# 局部函数:定义、功能与示例 1. 定义与功能 局部函数(Local Function)是嵌套在另一个方法内部的私有方法,仅在包含它的方法内可见。 • 作用:封装仅用于当前方法的逻辑,避免污染类作用域,提升…...
基于鸿蒙(HarmonyOS5)的打车小程序
1. 开发环境准备 安装DevEco Studio (鸿蒙官方IDE)配置HarmonyOS SDK申请开发者账号和必要的API密钥 2. 项目结构设计 ├── entry │ ├── src │ │ ├── main │ │ │ ├── ets │ │ │ │ ├── pages │ │ │ │ │ ├── H…...

02.运算符
目录 什么是运算符 算术运算符 1.基本四则运算符 2.增量运算符 3.自增/自减运算符 关系运算符 逻辑运算符 &&:逻辑与 ||:逻辑或 !:逻辑非 短路求值 位运算符 按位与&: 按位或 | 按位取反~ …...