Ubuntu下安装LLVM/Clang

2023-11-07

关于LLVM和Clang

参考原文:https://blog.csdn.net/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.csdn.net/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,如果要使用编译好的二进制文件,则必须需要填写绝对路径。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Ubuntu下安装LLVM/Clang 的相关文章

  • 如何在linux中使用iptables将http和https流量转发到透明代理[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 这个问题似乎不是关于主要由程序员使用的特定编程问题 软件算法或软件工具 help on topic 如果您认为该问题与主题相关另一个 St
  • 套接字发送调用被阻塞很长时间

    我每 10 秒在套接字上发送 2 个字节的应用程序数据 阻塞 但发送调用在下面的最后一个实例中被阻塞超过 40 秒 2012 06 13 12 02 46 653417 信息 发送前 2012 06 13 12 02 46 653457 信
  • 用于获取特定用户 ID 和进程数的 Bash 脚本

    我需要 bash 脚本来计算特定用户或所有用户的进程 我们可以输入 0 1 或更多参数 例如 myScript sh root deamon 应该像这样执行 root 92 deamon 8 2 users has total proces
  • 为什么 call_usermodehelper 大多数时候都会失败?

    从内核模块中 我尝试使用 call usermodehelper 函数来执行可执行文件 sha1 该可执行文件将文件作为参数并将文件的 SHA1 哈希和写入另一个文件 名为输出 可执行文件完美运行 int result 1 name hom
  • aarch64 Linux 硬浮点或软浮点

    linux系统有arm64 有arm架构armv8 a 如何知道 Debian 运行的是硬浮动还是软浮动 符合 AAPCS64 GNU GCC for armv8仅提供硬浮动aarch64工具链 这与 armv7 a 的 GCC 不同 后者
  • 如何回忆上一个 bash 命令的参数?

    Bash 有没有办法回忆上一个命令的参数 我通常这样做vi file c其次是gcc file c Bash 有没有办法回忆上一个命令的参数 您可以使用 or 调用上一个命令的最后一个参数 Also Alt can be used to r
  • 查找并删除超过 x 天的文件或文件夹

    我想删除超过 7 天的文件和文件夹 所以我尝试了 17 07 14 email protected cdn cgi l email protection find tmp mindepth 1 maxdepth 1 ctime 7 exec
  • 如何从程序内部获取指向程序的特定可执行文件部分的指针? (也许是诽谤)

    我在 Linux 环境中 需要编写一个程序来检索放置在其可执行文件的某个部分中的一些数据 那么 如何从程序内部获取指向程序某个部分 通过其名称 的指针呢 我知道可以使用elf getdata 将节的索引作为参数传递给 get 和Elf Da
  • 如何指定配置脚本的包含目录

    我的工作场所有一个 Linux 系统 其中包含相当旧的软件包 并且没有 root 访问权限 我正在从源代码编译我需要的包 prefix somewhere in homedir 我的问题是我只是不知道如何说服配置在特定目录中查找头文件 源码
  • 打印本周星期一的日期(在 bash 中)

    我想获取本周星期一的 YYYYMMdd 格式的日期 例如 今天是 20110627 从明天到周日 我仍然想打印周一 今天 的日期 然后下周重复这个过程 monday date dmonday Y m d last monday date d
  • 有没有办法提高linux管道的性能?

    我正在尝试使用 64 位将超高速数据从一个应用程序传输到另一个应用程序CentOS http en wikipedia org wiki CentOS6 我使用以下方法进行了基准测试dd发现阻碍我的是管道而不是程序中的算法 我的目标是达到
  • 通过名称获取进程ID

    我想在 Linux 下获得一个给定其名称的进程 ID 有没有一种简单的方法可以做到这一点 我还没有在 C 上找到任何可以轻松使用的东西 如果追求 易于使用 char buf 512 FILE cmd pipe popen pidof s p
  • 用于 e NetworkManager VPN 连接的 dbus 信号处理程序

    我需要开发一些在建立 VPN 连接时执行的 python 代码 VPN 由 NetworkManager 控制 我试图弄清楚如何为此使用 NM DBUS 事件 使用 dbus monitor system 我能够识别连接信号 signal
  • 每个虚拟主机的错误日志?

    在一台运行 Apache 和 PHP 5 的 Linux 服务器上 我们有多个带有单独日志文件的虚拟主机 我们似乎无法分离 phperror log虚拟主机之间 覆盖此设置
  • 在 Linux 服务器上创建和编辑 MS-Word 文档?

    希望开发处理文档的服务器端应用程序 源文档大多是MS Word 2003 2007 即MS版本的Docx 希望服务器应用程序能够在linux或windows上运行 想知道在linux下读写MS Word文件最好的工具或库是什么 兼容性是最重
  • Linux 上的“软/硬 nofile”是什么意思

    当我尝试在RedHat EL5上安装软件时 我得到了错误 软 硬nofile的期望值是4096 而默认值是1024 我设法增加了这个数字 但我不知道参数是什么 他们指的是软链接和硬链接吗 我改变的方法是 a 修改 etc security
  • 使用 .htaccess 启用 PHP 短标签

    我在自己的 Centos 服务器上设置了 Apache 并具有多个虚拟 Web 服务器 并且我希望仅为位于以下位置的其中一个 Web 服务器启用 PHP 短标记 var www ostickets html 我可以通过添加成功启用短标签sh
  • 删除 Python 中某些操作的 root 权限

    在我的 Python 脚本中 我执行了一些需要 root 权限的操作 我还创建并写入文件 我不想由 root 独占所有 而是由运行我的脚本的用户独占所有 通常 我使用以下命令运行脚本sudo 有办法做到上述吗 您可以使用以下方式在 uid
  • ARM 的内核 Oops 页面错误错误代码

    Oops 之后的错误代码给出了有关 ARM EX 中的恐慌的信息 Oops 17 1 PREEMPT SMP在这种情况下 17 给出了信息 在 x86 中它代表 bit 0 0 no page found 1 protection faul
  • php56 - CentOS - Remi 仓库

    我刚刚在测试盒上安装了 php 5 6 正常的 cli php 解释器似乎不存在 gt php v bash php command not found gt php56 v PHP 5 6 13 cli built Sep 3 2015

随机推荐

  • g2o 学习

    参考文章 如需详细请看原文 SLAM从0到1 6 图优化g2o 从看懂代码到动手编写 长文 yikang的文章 知乎 https zhuanlan zhihu com p 121628349 从零开始一起学习SLAM 理解图优化 一步步带你
  • SSH连接服务器经常被断开解决方法

    SSH连接服务器经常被断开解决方法 vim etc ssh sshd config UseDNS no 修改成功之后 重启SSH服务 service sshd restart 连接服务器超时掉线解决办法 vim etc ssh sshd c
  • 推荐!国外程序员整理的机器学习资源大全

    本文汇编了一些机器学习领域的框架 库以及软件 按编程语言排序 C 计算机视觉 CCV 基于C语言 提供缓存 核心的机器视觉库 新颖的机器视觉库 OpenCV 它提供C C Python Java 以及 MATLAB接口 并支持Windows
  • vrep笔记

    这些天主要对vrep做了一些探索 一些笔记如下 1 urdf机器人模型文件的导入 点击plugins urdf importing即可 2 动力学模型的配置 将此处改成零 大意是以方框的正中心为质心 否则很容易抖 模型导入后坐标系都会被这个
  • NLP预训练模型系列-BERT

    NLP预训练模型系列文章目录 1 BERT 2 GPT 3 GPT 2 4 GPT 3 5 RoBERTa 6 BART 7 XLNet 目录 NLP预训练模型系列文章目录 前言 从BERT开始 1 Abstract 2 Introduct
  • 基于Django的员工管理系统1

    主题 员工管理系统 1 新建项目 2 创建app python manage py startapp app01 点击 run manage py Task 然后输入startapp app01 注册app 3 设计表结构 models p
  • IT技术岗位面试怎么介绍自己的项目经验?

    泽林又一批学员即将毕业 需要为面试做一些准备 都说面试7份靠能力 3份靠技能 而开始时的介绍项目又是技能中的重中之重 决定一次面试的成败 那么面试时如果介绍自己的项目呢 泽林教育为你们梳理了一份详细的项目经验介绍 预测面试官提问 先规划好答
  • android-smart-image-view源码分析

    public class BitmapImage implements SmartImage 定义Bitmap对象 private Bitmap bitmap 构造方法 public BitmapImage Bitmap bitmap th
  • 字面值。。

    1概念 不能改变的量 2 分类 基本类型 整型 short int 没有短整型字面值 int 100 d long int 100L ld long long int 100LL lld unsigned short int 没有短整型字面
  • git 在不同服务器主机上同步 git 仓库

    git 在不同服务器主机上同步 git 仓库 参考链接 https opentechguides com how to article git 177 git sync repos html 1 在本地的一个文件夹中执行 git clone
  • js实现AES加密

    安装第三方加密包 npm i crypto js 加密代码 let str 需要加密的字符串 let keyStr 密钥 let ivStr iv偏移量 const key CryptoJS enc Utf8 parse keyStr 十六
  • WGS84坐标系下大地坐标转换为空间直角坐标

    大地坐标表示方法 BLH 空间直角坐标表示方法 XYZ 进行地图投影的一般操作步骤为先将BLH转换为XYZ 然后将XYZ通过三参数或者7参数的办法转换为xyz 涉及到两个椭球体以及坐标系之间的转换 本文主要讨论BLH转换为XYZ的办法 通过
  • 线性代数的本质(二)——线性变换与矩阵

    文章目录 线性变换与矩阵 线性变换与二阶方阵 常见的线性变换 复合变换与矩阵乘法 矩阵的定义 列空间与基 矩阵的秩 逆变换与逆矩阵 线性变换与矩阵 线性变换与二阶方阵 本节从二维平面出发学习线性代数 通常选用平面坐标系 O x y Oxy
  • Java中jdbc的框架

    使用框架可以简化代码 提高开发效率 所以了解和掌握一些框架也是必须的 下面简单介绍几个jdbc框架 1 jdbcTemplate Spring提供 2 commons dbutils Apache提供 小巧的jdbc轻量级封装的工具包 主要
  • 【YARN】(1)-- 整体架构、RM、NM、AM等基础组件快速理解

    一 Yarn的功能和整体架构 Apache Hadoop YARN Yet Another Resource Negotiator 另一种资源协调者 是一种新的 Hadoop 资源管理器 它是一个通用资源管理系统和调度平台 可为上层应用提供
  • 什么是自动化测试?如何开展自动化测试你需要知道这些点

    目录 前言 什么是自动化测 分层的自动化测试 我为什么要做自动化测试 什么项目适合做自动化测试 选择什么工具进行自动化测试 selenium 用前须知 selenium IDE selenium Grid selenium RC selen
  • 怎样用苹果手机播放html文件夹,无需转格式 如何用iPhone轻松爽看各种片

    iPhone 5问世后 瞬间就成为了大家追随的最热门产品之一 无论是最具创新还是最热门 每一款产品推出后总是会存在遗憾的 iPhone 5同样不例外 在大家眼中它可能有这样或那样的问题 但是在我看来 自带视频播放器仅支持指定苹果标准视频 不
  • uni-app根据经纬度逆解析详细地址

    uni app中的getLocation 方法可以获取到用户当前的地理位置 经纬度 速度 但是返回参数中的address在app中才会显示 小程序中不会显示 所以我们需要进行逆解析其地址 解析出它的地址信息 1 首先要在腾讯位置服务中 控制
  • 第三方登陆--接入谷歌和FaceBook

    一 第三方登陆流程 一 用户点击登录 前端会调用第三方的SDK 获取到对应的数据 一般会有token userId 二 前端拿到这些信息之后 回调自己后端服务端的接口 进行token校验 主要目的是后端得防止他人使用恶意手段 别的平台 或者
  • Ubuntu下安装LLVM/Clang

    关于LLVM和Clang 参考原文 https blog csdn net SiberiaBear article details 103111028 LLVM 起初的作者是 Chris Lattner 博硕期间研究关于编译器优化的东西 其