关于LLVM和Clang
参考原文:https://blog.youkuaiyun.com/SiberiaBear/article/details/103111028
LLVM 起初的作者是 Chris Lattner。博硕期间研究关于编译器优化的东西,其中一篇论文中提出了一套在编译时、连接时、运行时、闲置时的优化策略,llvm 的基本思想也大概确定下来。在这之前,apple 公司一直使用 GCC 作为编译器,但是 GCC 对 apple 的 Objective-C 支持不够完善,Apple 自己开发的 GCC 模块又不能得到 GCC 委员会的合并,到了 Chris Lattner 毕业时,Apple 就将其招入开发自己的编译器了,所以 LLVM 起初就得到了 Apple 的强力支持。
LLVM 最初设计时,只想着做优化方面的研究,所以只想搭建一套虚拟机,当时全程叫做 Low Level Virtual Machine,后面变成了编译器,而官方放弃了这个称呼,但是 LLVM 还是保留下来了,
因为 LLVM 是一个编译器框架,所以还需要一个前端来支撑整个系统,所以 Apple 又加大人力研发了 Clang,作为整个编译器的前端,Clang 用来编译 C、C++、Objective-C。
LLVM 作为编译器框架,是需要各种功能模块支撑起来的,它就不能被看做是系统的一部分,你仍可以将 Clang和 lld 都看做是 LLVM 的组成部分,框架的意思是,你可以基于 LLVM 提供的功能开发自己的模块,并集成在 LLVM 系统上,增加它的功能,或者就单纯自己开发软件工具,而利用 LLVM 来支撑底层实现)。LLVM 由一些库和工具组成,正因为它的这种设计思想,使它可以很容易和 IDE 集成(因为 IDE 软件可以直接调用库来实现一些如静态检查这些功能),也很容易构建生成各种功能的工具(因为新的工具只需要调用需要的库就行)。
参考原文:https://blog.youkuaiyun.com/fengbingchun/article/details/79252110/
Clang 项目包括 Clang 前端和 Clang 驱动程序等。这个软件项目在 2005 年由苹果电脑发起,是 LLVM 编译器工具集的前端 (front-end),目的是输出代码对应的抽象语法树 (Abstract Syntax Tree, AST),并将代码编译成LLVM Bitcode。接着在后端 (back-end) 使用 LLVM 编译成平台相关的机器语言。
通常我们在命令行上调用的 Clang 工具,是 Clang 驱动程序,因为 LLVM 本质上只是一个编译器框架,所以需要一个驱动程序把整个编译器的功能串起来,Clang 能够监控整个编译器的流程,即能够调用到Clang 和 LLVM 的各种库,最终实现编译的功能。
简单来说:Clang 是一个 C、C++、Objective-C 和 Objective-C++ 编程语言的编译器前端。它采用了底层虚拟机(LLVM)作为其后端。它的目标是提供一个 GNU 编译器套装 (GCC) 的替代品。
Clang 本身性能优异,其生成的 AST 所耗用掉的内存仅仅是 GCC 的 20% 左右。2014 年 1 月发行的FreeBSD10.0 版将 Clang/LLVM 作为默认编译器。
测试证明 Clang 编译 Objective-C 代码时速度为 GCC 的 3 倍,还能针对用户发生的编译错误准确地给出建议。
在编译器命令上 Clang 和 GCC 大同小异(兼容 GCC),使用 GCC 的编译的项目只需要修改几个固定参数就可以改成使用 Clang 编译。
总结来说:Clang的特性就是编译速度快,内存占用小,兼容 GCC,设计清晰简单,容易理解,易于扩展和增强,基于库的模块化设计,方便对其做定制和开发,且易于和系统及 IDE 集成,出错提示友好。
但是当前的 Clang 的 C++ 新特性支持落后于 GCC,而且 GCC 除了支持 C/C++/ Objective-C 外,还支持 Java/Ada/Fortran/Go等,这也是 GCC 对比 Clang 的优势。
Ubuntu下安装LLVM/Clang
参考原文:https://www.cnblogs.com/kele-dad/p/12955804.html
Ubuntu 安装 clang 编译器:
LLVM 官方 apt 网站:https://apt.llvm.org/
先执行以下命令:
wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key|sudo apt-key add -
修改 sources.list:
sudo vim /etc/apt/sources.list
deb http://apt.llvm.org/focal/ llvm-toolchain-focal main
deb-src http://apt.llvm.org/focal/ llvm-toolchain-focal main
deb http://apt.llvm.org/focal/ llvm-toolchain-focal-9 main
deb-src http://apt.llvm.org/focal/ llvm-toolchain-focal-9 main
deb http://apt.llvm.org/focal/ llvm-toolchain-focal-10 main
deb-src http://apt.llvm.org/focal/ llvm-toolchain-focal-10 main
执行:sudo apt-get update
然后执行安装:
sudo apt-get install clang-format clang-tidy clang-tools clang clangd libc++-dev libc++1 libc++abi-dev libc++abi1 libclang-dev libclang1 liblldb-11-dev libllvm-ocaml-dev libomp-dev libomp5 lld lldb llvm-dev llvm-runtime llvm python-clang
使用 Clang 编译 C:
$ clang test.c -o test
使用 Clang 编译 C++:
$ clang++ test.cpp -o test
Ubuntu 下安装 CMake:
$ sudo apt-get install cmake
为 CMake 指定编译器为 Clang,在 CMakeLists.txt 文件中设置编译器选项(其中 Clang 的安装路径可以使用 clang -v 查看)。
SET (CMAKE_C_COMPILER "/usr/bin/clang") # 填写绝对路径
SET (CMAKE_CXX_COMPILER "/usr/bin/clang++") # 填写绝对路径
在实际测试中,没有使用绝对路径也可以编译通过,因为在系统安装了 Clang,如果要使用编译好的二进制文件,则必须需要填写绝对路径。