clang

本文对比了Clang和GCC编译器。Clang编译速度快、占用内存小、模块化设计、诊断信息可读性强、易扩展且学习曲线平缓,支持C/C++等语言和Linux等平台,但对C++支持落后于GCC。GCC流行久,支持平台完备,还支持Fortran等更多语言。
一、Clang简介

        简单来说,Clang是一个编译器,目前用来编译C、C++、Objective-C语言。
        更进一步来说,Clang只是一个编译器前端,其将上述的C类语言编译成一种“汇编语言(中间语言)”。接着,通过LLVM(Low Level Virtual Machine)作为后端,将这种“汇编语言”编译成针对不同机器的二进制机器语言。
        Clang是在类BSD许可证下发布,所以不必担心像GPL下发布的GCC那样,不能在商业软件中使用。

二、Clang/LLVM的特性

真正的自由!
        Clang是在类BSD许可证下发布,所以不必担心像GPL下发布的GCC那样,不能在商业软件中使用。而GPL的“自由”,以我的观点,就是象牙塔里的“自由”。而真正推动社会进步的力量,其中很重要的一步是经济力量。虽然GPL没有禁止软件的商业用途,但是其强制开放源码的策略,让许多试图在 部分闭源的软件中使用开源软件公司望而却步。
        当然,这仅仅从商业上的软件重用的角度来看待问题的。在刺激和保障开源软件的连续性上,GPL的用途是不可磨灭的。

方面的学习
       GCC的参与者众多,代码参差不齐,开发年限很长,因而庞大而臃肿,对于试图初学编译器相关知识的朋友来说,阅读GCC的源码会让人有点不知所措。而Clang却轻盈许多,代码简单易懂,占用内存小。
        根据 Apostolou Dimitrios于2011年7月5日在GCC开发邮件列表中GSOC-Student Roundup的邮件中所说的 一段话:“对我来说,阅读GCC代码库已变得非常困难。事实上这是我唯一所知道的随着时间的流逝而变得越来越复杂的项目”(译自维基百科)
        如果想学习编译器的相关知识,不妨尝试阅读Clang/LLVM的代码。

相比于 GCC,Clang 具有如下优点:(摘自 结构化编译器前端 Clang 介绍
  • 编译速度快:在某些平台上,Clang 的编译速度显著的快过 GCC。
  • 占用内存小:Clang 生成的 AST 所占用的内存是 GCC 的五分之一左右。
  • 模块化设计:Clang 采用基于库的模块化设计,易于 IDE 集成及其他用途的重用。
  • 诊断信息可读性强:在编译过程中,Clang 创建并保留了大量详细的元数据 (metadata),有利于调试和错误报告。
  • 设计清晰简单,容易理解,易于扩展增强。与代码基础古老的 GCC 相比,学习曲线平缓。
当前 Clang 还处在不断完善过程中,相比于 GCC, Clang 在以下方面还需要加强:
  • 支持更多语言:GCC 除了支持 C/C++/Objective-C, 还支持 Fortran/Pascal/Java/Ada/Go 和其他语言。Clang 目前支持的语言有 C/C++/Objective-C/Objective-C++。
  • 加强对 C++ 的支持:Clang 对 C++ 的支持依然落后于 GCC,Clang 还需要加强对 C++ 提供全方位支持。
  • 支持更多平台:GCC 流行的时间比较长,已经被广泛使用,对各种平台的支持也很完备。Clang 目前支持的平台有 Linux/Windows/Mac OS。
另外,FreeBSD10计划以Clang来代替GCC

三、Clang使用

        写好一个C语言的Hello World之后(文件名为test.c)。

点击(此处)折叠或打开

  1. #include <stdio.h>
  2.  int main(int argc, char **argv)
  3.  {
  4.     printf("hello world\n");
  5.     return 0;
  6.  }
        在对应的文件夹下(假设已经安装好Clang,Linux各个发行版安装Clang很简单的,目前我是在Linux下做的,关于Windows下Clang的编译安装,到时候我会写个教程),输入:

点击(此处)折叠或打开

  1. clang test.c
        就可以编译出常见的a.out了,这时输入a.out就可以在终端显示出“Hello world了”。

四、最重要的一点

        撇开编译器上的常见用途。Clang的优势有:拥有清晰的错误提示;模块化设计,方便二次开发(非常重要);可与IDE完美结合!

目前就先写到这,有空我再补充。
08-16
### Clang 编译器使用指南及常见问题 Clang 是 LLVM 项目的一部分,是一款用于 C、C++、Objective-C 等语言的开源编译器前端。它以其快速编译、低内存占用和丰富的诊断信息而闻名。以下是关于 Clang 编译器的使用指南及常见问题解析。 #### 使用 Clang 编译 C/C++ 代码 1. **基本编译命令** 使用 Clang 编译 C 或 C++ 文件时,可以使用 `clang` 或 `clang++` 命令,分别对应 C 和 C++ 语言。例如: ```bash clang -o hello hello.c clang++ -o hello_cpp hello.cpp ``` 2. **启用 Clang-Tidy 进行静态代码检查** Clang-Tidy 是一个静态分析工具,可以检测代码中的潜在问题并提供修复建议。可以通过 `--clang-tidy` 参数启用 Clang-Tidy,或者在配置文件中指定: ```json { "clangd.path": "/usr/local/bin/clangd", "clangd.arguments": ["--background-index", "--clang-tidy"] } ``` 此外,可以使用 `-checks=` 选项来过滤需要启用的检查规则,例如: ```bash clang-tidy -checks='*' file.cpp ``` 3. **将警告升级为错误** 如果希望将某些警告视为错误,可以使用 `-warnings-as-errors=` 选项。此选项仅对通过 `-checks=` 启用的检查生效: ```bash clang-tidy -checks='*' -warnings-as-errors='*' file.cpp ``` #### 常见问题及解决方案 1. **Clang-Tidy 不生效** 如果 Clang-Tidy 没有按照预期工作,请检查是否在构建配置中启用了相关检查。`-checks=` 选项不会打开构建配置中未启用的警告。 2. **如何配置 Clang-Tidy 检查规则** 可以在 `.clang-tidy` 配置文件中定义检查规则。例如: ```yaml Checks: '-*,modernize-use-override' ``` 上述配置表示禁用所有检查,仅启用 `modernize-use-override` 规则。 3. **Clang-Tidy 与编译参数冲突** `-checks=` 选项不会影响编译参数,因此需要确保编译器的警告选项(如 `-Wall`、`-Wextra`)与 Clang-Tidy 的检查规则一致。 4. **如何查看详细的诊断信息** 使用 `-v` 参数可以启用详细输出,显示 Clang 的诊断信息: ```bash clang++ -v -o hello hello.cpp ``` 5. **如何在 IDE 中集成 Clang** 许多现代 IDE(如 Visual Studio Code、CLion)支持 Clang 作为默认编译器。可以通过配置 `settings.json` 文件来指定 Clang 的路径和参数: ```json { "clangd.path": "/usr/local/bin/clangd", "clangd.arguments": ["--background-index", "--clang-tidy"] } ``` 6. **如何处理编译错误和警告** Clang 提供了清晰的错误和警告信息,通常会指出错误的具体位置和可能的修复方法。例如: ```bash error: use of undeclared identifier 'x' ``` 上述错误提示表明变量 `x` 未声明,需要检查变量是否正确定义。 #### 高级用法 1. **使用 `-Werror` 将警告视为错误** 如果希望将所有警告视为错误,可以使用 `-Werror` 选项: ```bash clang++ -Werror -o hello hello.cpp ``` 2. **跨平台编译** Clang 支持多种目标架构和平台,可以通过 `-target` 选项指定目标平台。例如: ```bash clang++ -target arm-linux-gnueabi -o hello_arm hello.cpp ``` 3. **优化选项** Clang 支持多种优化级别,可以通过 `-O` 选项指定。例如: ```bash clang++ -O3 -o hello hello.cpp ``` 上述命令使用 `-O3` 优化级别进行编译。 #### 总结 Clang 是一个功能强大且灵活的编译器,适用于多种开发场景。通过合理配置 Clang-Tidy 和编译选项,可以提高代码质量和编译效率。在使用过程中,注意 Clang 的诊断信息可以帮助快速定位和解决问题。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lm_y

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值