网站首页 > 技术文章 正文
什么是clang编译器?
clang是LLVM编译器工具集的一个用于编译C、C++、Objective-C的前端。LLVM项目的目标是提供一个GNU编译器套装(gcc)的替代品,由苹果公司的赞助开发,其源代码授权采用的是类BSD的伊利诺伊大学厄巴纳-香槟分校开源码许可。
clang编译器的优势与劣势
相比于gcc,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。
安装LLVM + clang
二进制安装
- 纯Windows环境: 可以从http://llvm.org/releases/下载相应的安装包进行安装。目前最新版本为3.8。
- cygwin下的apt-cyg:apt-cyg install clang
- Linux下的yum:sudo yum install clang
- Linux下的apt-get(有时候需要自己配置一下相关的软件源):sudo apt-get install clang-3.4 clang-3.4-doc libclang-common-3.4-dev libclang-3.4-devlibclang1-3.4 libclang1-3.4-dbg libllvm-3.4-ocaml-dev libllvm3.4 libllvm3.4-dbg lldb-3.4 llvm-3.4 llvm-3.4-dev llvm-3.4-doc llvm-3.4-examples llvm-3.4-runtime clang-modernize-3.4 clang-format-3.4 python-clang-3.4 lldb-3.4-dev
源码安装
- 第一步,下载llvm代码:git clone git@github.com:llvm-mirror/llvm.git
- 第二步,进入llvm/tools目录并下载clang代码cd llvm/tools git clone git@github.com:llvm-mirror/clang.git
- 第三步,进入llvm/projects目录并下载compiler-rt代码:cd ../projects git clone git@github.com:llvm-mirror/compiler-rt.git
- 第四步,在llvm所在目录新建与llvm同一级的目录build,并在其中构建llvm和clang:cd ../.. mkdir build cd build ../llvm/configure --enable-optimized --enable-assertions make make install
使用clang编译C程序
clang的用法与gcc基本相同,我们可以写一个脚本来验证一下编译器是否已经安装完成:
import os
import sys
import shutil
if not len(sys.argv) in range(2, 3):
print("Usage: hello_c.py <compiler>")
exit(1)
code = "#include <stdio.h>\n int main(void) { printf(\"hello world!\\n\"); return 0;} "
if(not os.path.exists("example")):
os.mkdir("example")
file = open(r"example/hello.c",'w')
file.writelines(code)
file.close()
cmd = sys.argv[1] + r" example/hello.c -o example/test.exe"
os.system(cmd)
os.system(r"example/test.exe")
if(os.path.exists("example")):
shutil.rmtree("example")
然后,我们只需要在shell中输入python hello_c.py clang即可,如果看到输出一行“hello world”说明编译器已经可以正常工作。
猜你喜欢
- 2024-10-09 教你快速录制gif动图(动图录屏怎么弄?)
- 2024-10-09 简单实用且好看!基于electron的的开源图床工具
- 2024-10-09 ubuntu 环境下 ruby 环境快速搭建
- 2024-10-09 史上最全的实际操作的!git+jenkins+k8s 自动化部署运维
- 2024-10-09 HTTP压测工具wrk安装与使用(鲁班工具官网下载安装)
- 2024-10-09 基于docker安装myip开源工具查询本机ip和测试本机网络
- 2024-10-09 重玩 40 年前的经典游戏小蜜蜂,这次通关了源码
- 2024-10-09 open sora1.2容器构建教程指南(容器部署openstack)
- 2024-10-09 简单漂亮的(图床工具)开源图片上传工具——PicGo
- 2024-10-09 【iOS学习】使用 Xcode 开发 Clang 插件
- 1507℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 513℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 488℃MySQL service启动脚本浅析(r12笔记第59天)
- 467℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 465℃启用MySQL查询缓存(mysql8.0查询缓存)
- 445℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 425℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 422℃MySQL server PID file could not be found!失败
- 最近发表
- 标签列表
-
- c++中::是什么意思 (83)
- 标签用于 (65)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- chromepost (65)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- js判断是否是json字符串 (67)
- checkout-b (67)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- js数组插入 (83)
- linux删除一个文件夹 (65)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)