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


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1371.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

停车位类型分割系统:一条龙教学体系

停车位类型分割系统源码&数据集分享 [yolov8-seg-aux&yolov8-seg-C2f-DAttention等50全套改进创新点发刊_一键训练教程_Web前端展示] 1.研究背景与意义 项目参考ILSVRC ImageNet Large Scale Visual Recognition Challenge 项目来源AAAI Global Al l…

DICOM标准:CR图像模块属性详解——计算放射线照相术(CR)及其在DICOM中的表示

目录 CR图像及其在DICOM中的表示 1 计算放射线照相术 1.1 CR序列组件 1.1 -- CR 序列模块属性 1.2 CR 图像模块 表1.2 -- CR 图像模块属性 结论 CR图像及其在DICOM中的表示 计算放射线照相术(Computed Radiography, CR)是一种利用计算机技术对传统…

springboot 基于web的动漫会员购系统,计算机毕业设计项目源码 024,计算机毕设程序(LW+开题报告、中期报告、任务书等全套方案)

摘 要 随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,动漫艺术当然也不例外。动漫会员购系统是以实际运用为开发背景,运用软件工程原理和开发方法,采用…

dns构建

(1)用户输入域名发起域名查询请求。 (2)计算机操作系统先查找本地hosts文件中是否有这个域名与IP的对应关系,有就返回结果给用户,没有就进入下一步。 (3)hosts文件找那个没有此域名…

深度了解flink(九) JobManager(3) HA分析

HA核心类、接口 HighAvailabilityServices HighAvailabilityServices是HA Service的核心接口,具体功能如下: 1.定义了高可用组件(Dispatcher、ResourceManager等)的leader选举接口和leader获取接口 2.检查点元数据的持久&…

爱普生SG-8101CA可编程晶振应用在工业自动化机器人

在工业自动化的浪潮中,机器人无疑是最耀眼的明星,它们以高效、精准的工作能力重塑了现代工业生产的格局。而在这些工业自动化机器人的核心深处,爱普生 SG - 8101CA 可编程晶振就像一颗强大而稳定的心脏,为机器人的卓越表现提供了坚…

【HarmonyOS】引导用户跳转APP设置详情页开启权限

【HarmonyOS】引导用户跳转设置APP详情页开启权限 前言 众所周知在鸿蒙应用中,向用户申请权限时,会弹出系统请求授权的弹框。当用户拒绝了你申请的权限,弹框会直接关闭。当下次触发同样的权限申请,会直接返回失败,不…

【大数据学习 | HBASE】hbase的原理与组成结构

1. hbase的简述 hbase作为google的大数据三篇比较重要的论文之一,它的起源叫做bigtable,意思非常简单就是大表的意思,是一个分布式存储很多数据的大型表格系统,它是对于hdfs中的数据不能直观查询和随机读写的病痛的一个补充和完善…

在Zetero中调用腾讯云API的输入密钥的问题

也是使用了Translate插件了,但是需要调用腾讯云翻译,一直没成功。 第一步就是,按照这上面方法做:百度、阿里、腾讯、有道各平台翻译API申请教程 之后就是:Zotero PDF translat翻译:申请腾讯翻译接口 主要是…

再探“构造函数”(2)友元and内部类

文章目录 一. 友元‘全局函数’作友元‘成员函数’作友元‘类‘作友元 内部类 一. 友元 何时会用到友元呢? 当想让(类外面的某个函数/其它的类)访问 某个类里面的(私有或保护的)内容时,可以选择使用友元。 友元提供了一种突破&a…

(新)docker desktop镜像迁移

背景 docker desktop默认安装在系统c盘,久而久之随着镜像拉取的越多,系统盘占用则越来越大。现有的网络资源关于docker desktop迁移都是旧版本的,即4.30版本之前。在4.30版本及以后,在运行wsl -l -v时只有docker-desktop只有这一项…

19种RAG结构

文章目录 什么是RAG19种RAG总览Standard RAGCorrective RAG,纠错型RAGSpeculative RAG,推测型RAGFusion RAG,融合型RAGAgentic RAG,智能代理型RAGSelf RAG,自增强型RAGGraph RAG,图谱RAGAdaptive RAGREALM:…

flink 内存配置(一):设置Flink进程内存

Apache Flink通过严格控制各个组件的内存使用,在JVM之上提供了高效的工作负载。虽然Flink社区努力为所有配置提供合理的默认值,但由于用户部署在Flink上的应用范围很广,这并不总是可行的。为了给用户提供最大的生产价值,Flink支持…

ssm037物流管理系统设计与实现+jsp(论文+源码)_kaic

毕 业 设 计(论 文) 题目:物流管理系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本物流管理系统就是在这…

扩展卡尔曼滤波(EKF)的限制

当f (x)或h (x)接近线性时,EKF在许多实际问题上表现良好。然而,它在高度非线性的区域中失败了 EKF的概念是基于模型的线性化而提出的。EKF估计包括线性化误差。线性化误差取决于相对于传播的不确定度的函数的非线性度,如下图所示。 图13.13…

【ChatGPT】搜索趋势分析

【ChatGPT】搜索趋势分析 为了分析 ChatGPT 在过去一年的流行趋势,我们可以查看 Google Trends 的数据 安装依赖pytrends pip install pytrends运行以下 Python 脚本 import pandas as pd import matplotlib.pyplot as plt from pytrends.request import TrendR…

ctfshow——web(总结持续更新)

文章目录 1、基础知识部分2、php伪协议2.1 php://input协议2.2 data://text/plain协议 3、webshell连接工具3.1 蚁剑连接一句话木马 4、各个web中间件重要文件路径4.1 Nginx 5、sqlmap使用6、php特性6.1 md5加密漏洞 7、TOP 10漏洞7.1 SQL注入 1、基础知识部分 识别base64编码…

未来已来,软件行业的下一个风口在哪里?

引言 随着技术的迅猛发展,软件行业正在不断迎来新的机遇和挑战。在这个充满活力和变革的时代,企业和开发者们纷纷寻找下一个可能改变游戏规则的风口。那么,软件行业的下一个风口在哪里?让我们一同探索未来的潜在趋势与创新方向。 …

Python批量查找包含多个关键词的PDF文件

在信息爆炸的时代,数据管理变得愈发重要。U盘作为一种便携式存储设备,常常承载着我们大量的个人和工作数据。然而,随着文件数量的增加,在U盘中快速找到特定文件常常成为一个令人头疼的难题。我们通常可以采用everything来快速查找…

python网络爬虫基础:requests库的应用

Requests 库是在 urllib 的基础上开发而来,相比之下更加简洁优美,在编写爬虫程序时应用较为广泛。注意,本文更偏于程序实现,具体各个字段、参数的解释详见本专栏其他博文(后续看情况更新)。闲话少说&#x…