当前位置: 首页 > news >正文

源码编译安装 clang/gcc

在同一个机器上有多个人同时使用的时候,机器的环境比较复杂,会存在和别人使用的基础工具版本不同的情况,这个时候为了不影响其他人,也不被其他人影响,可以通过使用源码来编译。编译完成之后,通过环境变量的设置,来使其只针对当前的用户或者 teminal 生效。

1 源码编译安装 clang

这里以从源码安装clang-10为例。

  • 获取 clang 的源码
    Clang 的源码位于 llvm 源码目录llvm-project/clang中,因此直接获取 llvm 的源码
    bash git clone https://github.com/llvm/llvm-project.git
    • 切换到指定的版本(optional)
      git checkout release/10.x
      
    • 安装构建工具
      构建工具可以是GNU makeninja等。为了更快的增量编译,Clang 官网推荐使用ninja
      sudo apt-get install ninja-build
      
    • 调整配置参数(optional)
      • 可以调整配置参数,以获取定制的编译器。
        默认情况下,所有可支持的目标机器的相关代码都会被编译。为了减少编译时间,我们可以只编译可能会用到的目标机器。如果要指定只编译的目标机器为X86、AArch64和RISCV。可以使用如下选项:

        -DLLVM_TARGETS_TO_BUILD="X86;AArch64;RISCV"
        
      • 定编译哪些项目(optional)
        如果要指定只编译的项目为clang。可以使用如下选项:

        -DLLVM_ENABLE_PROJECTS=clang
        

        目前,所有的可选项如下所示:

        clang;clang-tools-extra;compiler-rt;debuginfo-tests;libc;libclc;libcxx;libcxxabi;libunwind;lld;lldb;mlir;openmp;parallel-libs;polly;pstl;flang
        
      • 指定生成的版本是 DEBUG 还是 RELEASE(optional)
        默认情况下,生成的是DEBUG版本。如果要指定生成RELEASE版本,可以使用如下选项:

        -DCMAKE_BUILD_TYPE=Release
        
      • 指定生成静态库还是共享库(optional)
        默认情况下,生成的是静态库。如果要指定生成共享库,可以使用如下选项:

        -DBUILD_SHARED_LIBS=ON
        
    • 编译
      • 创建并切到 build 目录
        在 llvm-project 目录中执行如下命令:
        mkdir build && cd build
        
      • 仅编译 Clang
        在 llvm-project/build 目录中执行如下命令:
        cmake -DLLVM_ENABLE_PROJECTS=clang -DBUILD_SHARED_LIBS=ON -G Ninja ../llvm/
        ninja clang -j128
        
        选项-j128表示并发任务最多可以有 128 个,从而减少编译时间。实际数量可根据机器实际的逻辑处理器数量来设置。
    • 测试
      • 安装 Clang 测试套件的依赖
        sudo apt-get install python3-distutils
        
        在不同的机器上运行时,缺少的依赖可能不同。如果运行 Clang 测试套件失败,则根据报错内容进行相应地解决。
      • 运行 Clang 测试套件
        在 llvm-project/build 目录中执行如下命令:
        ninja check-clang
        
        测试完成之后会输出测试结果。
        编译的 Clang——clang-10.0.0 位于 llvm-project/build/bin 目录中。

2 源码编译安装 gcc

这里以从源码安装gcc-9.3.0为例。

  • 源码下载
    bash wget http://ftp.gnu.org/gnu/gcc/gcc-9.3.0/gcc-9.3.0.tar.gz

    • 编译安装

      tar -zxvf gcc-9.3.0.tar.gz # 解压压缩包
      cd gcc-9.3.0
      mkdir build
      ../configure  # 开始配置安装
      

      开始配置后可能会出现缺少缺少 GMP、MPFR和 MPC这三个高精度的数学库的问题如

      configure: error: Building GCC requires GMP 4.2+, MPFR 3.1.0+ and MPC 0.8.0+.
      Try the --with-gmp, --with-mpfr and/or --with-mpc options to specify
      their locations. 
      

      安装缺少的库:

      sudo apt-get install libgmp-dev libmpfr-dev libmpc-dev gcc-multilib g++-multilib 
      

      再次使用 ../configure --enable-multilib 构建安装环境,构建完成后得到一个Makefile文件。开始编译

      make -j128  # -j选项后的数字取决于机器的逻辑处理器数量
      

      等待安装完成之后,输入sudo make install安装gcc。

    编译完成的gcc-9.3.0位于gcc-9.3.0/build/gcc目录中。

3 配置环境变量

~/.bashrc末尾添加如下内容:

export PATH=/path/to/gcc-9.3.0/build/gcc:$PATH
export PATH=/path/to/llvm-project/build/bin:$PATH

文件修改保存之后,source ~/.bashrc 使配置生效。

如果后面不需要使用这两个对应版本的工具了,重新设置环境变量即可。

相关文章:

  • 查看一个网站是否是用React搭建的
  • 安全等保评测-什么是“等保“?
  • 零基础入门学用Arduino 第三部分(二)
  • Linux DMA-Buf驱动框架
  • 超文本标记语言(HTML)简介
  • 基于Python+Flask+MySQL+HTML的B站数据可视化分析系统
  • uniapp使用css实现瀑布流
  • maven部署打包的pom配置
  • 即时聊天系统
  • TCP三次握手的过程
  • Github 2024-06-14 开源项目日报Top10
  • C语言之#define #if 预处理器指令
  • HTML前端
  • 基于LangChain-Chatchat实现的RAG-本地知识库的问答应用[0]-模型、工具、分词器等支持列表
  • VSCode插件开发之初始化项目
  • CentOS7简单部署NFS
  • js 实现textarea输入字数提示
  • JS函数式编程 数组部分风格 ES6版
  • Less 日常用法
  • PhantomJS 安装
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • Selenium实战教程系列(二)---元素定位
  • vue-router 实现分析
  • 初识 webpack
  • 分布式任务队列Celery
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 前言-如何学习区块链
  • 如何邀请好友注册您的网站(模拟百度网盘)
  • 使用common-codec进行md5加密
  • 算法系列——算法入门之递归分而治之思想的实现
  • 网络应用优化——时延与带宽
  • 学习使用ExpressJS 4.0中的新Router
  • ​马来语翻译中文去哪比较好?
  • #{}和${}的区别是什么 -- java面试
  • #pragma预处理命令
  • $.ajax中的eval及dataType
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • (十一)c52学习之旅-动态数码管
  • (四)React组件、useState、组件样式
  • (一)基于IDEA的JAVA基础10
  • (转)linux下的时间函数使用
  • (转)母版页和相对路径
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .Mobi域名介绍
  • .net core 控制台应用程序读取配置文件app.config
  • .NET Framework Client Profile - a Subset of the .NET Framework Redistribution
  • .NET 编写一个可以异步等待循环中任何一个部分的 Awaiter
  • .net解析传过来的xml_DOM4J解析XML文件
  • @select 怎么写存储过程_你知道select语句和update语句分别是怎么执行的吗?
  • @serverendpoint注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)
  • [BUUCTF 2018]Online Tool(特详解)
  • [BZOJ5250][九省联考2018]秘密袭击(DP)
  • [CareerCup] 14.5 Object Reflection 对象反射