LLVM编译

2023-11-17

欢迎到我的博客来阅读这篇文章: https://qiu-weidong.github.io/2022/05/01/llvm/build/

Windows下编译LLVM

安装Visual Studio

首先需要下载Visual Studio Installer的安装程序VisualStudioSetup.exe,下载链接: https://visualstudio.microsoft.com/zh-hans/downloads/。选择社区版,点击免费下载

下载后,双击运行VisualStudioSetup.exe。一路下一步即可安装Visual Studio Installer

接下来,点击任务栏左侧的搜索图标,搜索Visual Studio Installer,找到并启动。然后点击可用标签,在列表中找到社区版的Visual Studio,写这篇博客的时候,最新的Visual Studio版本是Visual Studio Community 2022,点击安装,即可进入相关配置界面。

根据需要选择工作负荷和组件。对于编译LLVM的需求来说,需要安装使用C++的桌面开发这个工作负荷。勾选后,点击安装,即可进行安装,等待安装完成即可。

安装完成之后,再次点击任务栏左侧的搜索图标,搜索Developer Powershell for VS 2022,并启动它。也可以点击开始菜单,滚动到字母V,找到Visual Studio 2022文件夹,点击展开,找到Developer Powershell for VS 2022,点击打开。

Developer Powershell for VS 2022类似windows上的Powershell工具,不同之处在于Developer Powershell for VS 2022添加了Visual Studio的相关工具到环境变量。例如,对于Visual Studio中的cl工具,如果在普通的Powershell里面输入cl命令,会提示无法将"cl"项识别为 cmdlet、函数、脚本文件或可运行程序的名称,而在Developer Powershell for VS 2022则会输出如下信息:

用于 x86 的 Microsoft (R) C/C++ 优化编译器 19.31.31107 版
版权所有(C) Microsoft Corporation。保留所有权利。

用法: cl [ 选项... ] 文件名... [ /link 链接选项... ]

因此,我们采用Developer Powershell for VS 2022作为编译LLVM的终端工具。

下载LLVM源码

使用git下载LLVM源代码,注意要禁用自动转译行结束符。

git clone --config core.autocrlf=false https://github.com/llvm/llvm-project.git

或者点击链接https://github.com/llvm/llvm-project/releases,直接下载需要版本的源代码。在编写这篇博客的时候,LLVM的最新版本是14.0.3 。

编译LLVM

打开Developer Powershell for VS 2022,进入到LLVM源码目录,这个源码目录是指有clang、llvm等子目录的目录。
新建一个文件夹用来存放编译结果,并进入新建的目录:

mkdir build
cd build

使用cmake来生成相关的构建文件:

cmake -G Ninja -DCMAKE_BUILD_TYPE=RELEASE -DLLVM_TARGETS_TO_BUILD="X86" -DLLVM_ENABLE_PROJECTS="clang"  -DLLVM_OPTIMIZED_TABLEGEN=ON ../llvm

其中-G Ninja参数表示生成Ninja系统的构建文件,采用Ninja系统会有比较快的编译速度。如果要使用其他的构建系统,只需要在-G参数的后面指定要使用的系统即可。可选的构建系统有Unix MakefilesVisual Studio 15 VS2017Visual Studio 16 VS2019Xcode等等。

-DCMAKE_BUILD_TYPE=RELEASE表示生成Release版本的LLVM,这种构建方式会进行优化,并且生成的目标文件体积会更小。如果不想生成数十GB的目标文件,请采用Release构建方式。如果需要调试,那么可以选用Debug构建方式。此外,还有RELWITHDEBINFO和MINSIZEREL方式的构建,RELWITHDEBINFO方式是使用调试符号的发布构建,而MINSIZEREL则是以优化文件大小为主的构建。

-DLLVM_TARGETS_TO_BUILD="X86"表示编译的目标平台是X86平台。如果你的电脑不是X86架构,或者你需要编译的LLVM在其他的机器上使用,请将它设置为相应的架构。可选的目标机器有AArch64、AMDGPU、ARM、BPF、Hexagon、Lanai、Mips、MSP430、NVPTX、PowerPC、RISCV、Sparc、SystemZ、WebAssembly、X86、XCore

-DLLVM_ENABLE_PROJECTS="clang"表示我们除了编译LLVM以外,还要编译clang。如果还需要编译其他工具,则在后面添加,并用分号分割。比如,要编译clang和lldb,则需要设置为-DLLVM_ENABLE_PROJECTS="clang;lldb"

-DLLVM_OPTIMIZED_TABLEGEN=ON表示对TABLEGEN开启优化,对于调试模式,这有利于提高编译速度。

另外一些可能需要修改的配置如下所示:

  • LLVM_ENABLE_EH=ON: 如果要启用异常,则配置

  • LLVM_ENABLE_RTTI=ON: 如果要启用RTTI

生成了构建文件之后,接下来进入编译。

建议关闭所有的应用程序,只保留Developer Powershell for VS 2022。因为Ninja会使用几乎所有的CPU核,可能导致其他应用卡顿,这也是我们使用Developer Powershell for VS 2022而不是Visual Studio IDE来编译的原因。

运行编译命令:

ninja 

经过漫长的等待,如果没有报错,则表示编译成功,进入安装过程。
使用以下命令测试是否成功编译:

bin/clang --version

如果得到以下输出,表示clang编译成功。

clang version 14.0.3
Target: i686-pc-windows-msvc
Thread model: posix
InstalledDir: path-to-llvm-source-code\build\bin

安装LLVM

以管理员方式重新打开Developer Powershell for VS 2022,并切换到之前的build目录。运行安装命令:

ninja install

成功将llvm安装到我们的电脑里面。安装路径在C:\Program Files (x86)\LLVM或者C:\Program Files\LLVM。找到安装目录,将C:\Program Files (x86)\LLVM\binC:\Program Files (x86)\LLVM\lib添加到环境变量。并使用以下命令进行测试:

clang --version

如果能得到相关clang的版本信息,则表示安装成功。

测试clang

新建一个cpp文件main.cpp。

#include <iostream>

int main(int argc, const char ** argv) {
    std::cout << "Hello Clang World!" << std::endl;
}

使用clang编译该文件:

clang main.cpp -o main.exe

编译得到可执行文件main.exe,运行它,得到输出:

Hello Clang World!

Linux下编译LLVM

安装编译器

需要安装gcc、g++、ninja、cmake等工具,一般linux系统会自带,如果没有,则使用apt安装即可,命令如下:

sudo apt install–y gcc g++ cmake ninja-build

下载LLVM源代码

这部分和windows下类似,使用如下所示git命令:

git clone https://github.com/llvm/llvm-project.git

同样地,也可以到https://github.com/llvm/llvm-project/releases去下载相应代码。

编译LLVM

同windows下一样,进入源代码目录,新建build文件夹,然后进入build。

mkdir build
cd build

使用cmake来生成构建文件,推荐使用Ninja

cmake -G Ninja -DCMAKE_BUILD_TYPE=RELEASE -DLLVM_TARGETS_TO_BUILD="X86" -DLLVM_ENABLE_PROJECTS="clang"  -DLLVM_OPTIMIZED_TABLEGEN=ON ../llvm

相关配置前面已经说明,这里不再重复。

接下来运行编译命令:

ninja

安装LLVM

编译完成后,执行安装命令即可:

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

LLVM编译 的相关文章

  • 使用 C++ 拆分“[常规设置]”格式的节字符串

    我是 C 新手 我想读取包含部分和键值对的 ini 文件 根据部分 我想读取相应键的值 首先 我想阅读方括号内的部分 请帮忙 谢谢 对于真正的 INI 文件解析 我强烈建议iniparser库 http ndevilla free fr i
  • 使用预编译头减少 clang 编译时间

    我正在开发一个数据库项目 该项目将查询 以某种高级语言表示 编译为 C 代码 这段代码由数据库编译并执行 那部分工作得很好 现在 我正在尝试减少 C 查询代码的编译时间 我想知道是否可以使用预编译头来提高性能 该查询被转换为一个名为 Que
  • 操作/Lambda 表达式内存管理问题

    我将一个操作存储在局部变量中 然后在该局部变量超出范围后使用 使用前是否有被清理的危险 这是一个例子 public List GetMaps Action
  • 将 Python 控制台集成到 GUI C++ 应用程序中

    I m going to add a python console widget into a C GUI below some other controls 许多类将暴露给 python 代码 包括一些对 GUI 的访问 也许我会考虑 P
  • 如何使用boost库读取和写入.ini文件[重复]

    这个问题在这里已经有答案了 如何使用boost库读取和写入 或修改 ini文件 With Boost PropertyTree您可以读取并更新树 然后写入文件 请参阅load and save功能 看一下如何访问属性树中的数据 http w
  • 求一个数的因数。无法得到准确的结果

    有人可以帮助纠正我的算法吗 我已经对几个数字进行了测试 但它没有输出完整的因式分解 对于具有大量因子的数字 它完全失败 int num 20 for int i 2 i lt num i if num i 0 cout lt lt i lt
  • 命名空间“Microsoft”中不存在类型或命名空间名称“Practices”

    我正在使用 Microsoft Visual Studio 2005 for c 我的代码中有以下命名空间 using Microsoft Practices EnterpriseLibrary using Microsoft Practi
  • C for 循环索引:新 CPU 中的前向索引更快吗?

    在我订阅的邮件列表上 两位知识渊博的 IMO 程序员正在讨论一些优化的代码 并说了以下内容 在 5 8 年前发布的 CPU 上 向后迭代 for 循环稍微快一些 e g for int i x 1 i gt 0 i 因为比较i归零比将其与其
  • 如何填充两个样条线或直线系列之间的区域

    我有这个Chart 如何填充两个之间的区域Series S0 and S1 说蓝色和黄色Series 为此 我们编写了其中之一Paint事件 这里的ValueToPixelPosition https msdn microsoft com
  • C++ 错误:从“char”到“const char*”的转换无效

    我对 C 完全陌生 我创建了这个函数 bool guessWord string compWord cout lt lt Guess a letter string userLetter cin gt gt userLetter for u
  • 带双重检查锁的单例设计模式

    假设您有以下代码 1 为什么我们使用双重检查锁 为什么单锁不够好 请提供详细的例子 2 这种实施方式的主要缺点是什么 我该如何证明呢 Thanks public sealed class SomeSingleton5 private sta
  • 使用宏计算源文件行数?

    是否可以使用 C C 预处理器将源文件中的行数计算为宏或某种编译时可用值 例如 我可以更换吗MAGIC1 MAGIC2 and MAGIC3在下面 并在使用时以某种方式获取值 4MAGIC3 MAGIC1 can be placed whe
  • 只读有运行时开销吗?

    出于某种原因 我一直认为readonly字段有与其相关的开销 我认为这是 CLR 跟踪是否存在readonly字段是否已初始化 这里的开销是一些额外的内存使用量 用于跟踪状态以及分配值时的检查 也许我这么认为是因为我不知道readonly字
  • 数组与映射的性能

    我必须循环一个大数组中的元素子集 其中每个元素都指向另一个元素 问题来自于检测大图中的连接组件 我的算法如下 1 考虑第一个元素 2 将下一个元素视为前一个元素所指向的元素 3 循环直到没有发现新元素 4 考虑1 3中尚未考虑的下一个元素
  • EWS - 给予预约,获取预约的所有者副本

    在 EWS 中进行预约后 是否可以获得所有者的副本 例如 如果我登录为user1 我有user1创建的约会的副本user2 我有冒充权 我要编辑user2预约的副本 我怎样才能获得user2 s copy 您可以使用 PidLidClean
  • 为什么我不能对普通变量进行多态?

    我是一名Java程序员 最近开始学习C 我对某事感到困惑 据我了解 在 C 中 要实现多态行为 您必须使用指针或引用 例如 考虑一个类Shape与实施的方法getArea 它有几个子类 每个子类都以不同的方式重写 getArea 然后考虑以
  • 修改代码以从 Windows 中的 PE 可执行文件检索双重签名信息?

    我已经挣扎了一段时间想要修改这段代码示例 https support microsoft com en us help 323809 how to get information from authenticode signed execu
  • 如何在 C# 中以编程方式创建柔和的颜色?

    根据所需的颜色数量均匀分布地生成它们 如果指定的计数为 8 则看起来像这样 List
  • 清理堆分配对象的良好实践或约定?

    我正在学习C 我有 C C ObjC 背景 相当高级的语言 在 C 或 ObjC 上 作为函数或方法的结果返回堆分配的对象是很简单的 因为对象的清理是受管理的 按照惯例 会在适当的时候销毁 但我不知道在 C 中应该如何处理这个问题 例如 s
  • 从 STL 列表中删除项目

    我想创建一个函数 如果符合特定条件 则将项目从一个 STL 列表移动到另一个列表 这段代码不是这样做的方法 迭代器很可能会被擦除 函数失效并导致问题 for std list

随机推荐

  • 如何让女人满意?多个心眼爱女人

    别以为只有男人甜言蜜语地哄骗女人 女人有时也会设下甜蜜的陷阱让男人钻 如果有一天 你那个素来刁蛮的小女人突然变得乖巧柔顺 温温柔柔地抱着你的胳膊说 亲爱的 我今天心情特别好 给你一分钟的时间诉诉苦苦吧 平时我有哪些缺点令你敢怒不敢言的 尽管
  • python学习笔记第一天

    一 Python的基本语法元素 Python程序从默认的第一条语句开始 按顺序依次执行各条语句 代码块可视为复合语句 Python使用严格的缩进 空格 来表示代码块 连续的多条具有相同缩进量的语句为一个代码块 注释用于为程序添加说明性的文字
  • Deep learning Reading List

    Following is a growing list of some of the materials i found on the web for Deep Learning beginners Free Online Books De
  • 简单HTML+css太极图

  • Tauri 应用中发送 http 请求

    最近基于 Tauri 和 React 开发一个用于 http https 接口测试的工具 Get Tools 其中使用了 tauri 提供的 fetch API 在开发调试过程中遇到了一些权限和参数问题 在此记录下来 权限配置 在 taur
  • vue中的input输入框按回车键自动搜索

    vue中的input输入框按回车键自动搜索 在input标签内部增加 keyup enter事件即可 事件名为按钮点击名称
  • python之文件夹拷贝(亲测可用)

    效果 import os import shutil def copy dir src path dst path source path os path abspath src path target path os path abspa
  • centos7 mysql 机器重启后pid文件丢失导致mysql 服务无法重启

    1 首先执行命令vim etc my cnf 查看pid存储的路径 pid file xxxxxx 2 到对应的路径下查看发现已经丢失了 mysqld pid创建在系统的run目录下 该目录是运行在内存中的 因此服务器重启后文件不存在 3
  • CentOS 7 下 minikube 部署 && 配置

    CentOS 7 下 minikube 部署 配置 文章目录 CentOS 7 下 minikube 部署 配置 下载 安装 下载安装脚本 安装 minikube 启动 minikube 环境 安装 kubectl 工具 启动 miniku
  • 在Caffe中调用TensorRT提供的MNIST model

    在TensorRT 2 1 2中提供了MNIST的model 这里拿来用Caffe的代码调用实现 原始的mnist mean binaryproto文件调整为了纯二进制文件mnist tensorrt mean binary 测试结果与使用
  • 【Git】git push origin master时发生的各类错误汇总

    文章目录 一 常见的git命令 二 错误一 三 错误二 四 错误三 五 问题解决 一 常见的git命令 使用 git 命令时 您可以执行一系列操作来管理代码仓库 下面是一些常用的 git 命令及其功能 git init 在当前目录初始化一个
  • 【计算机网络】网络层:网际控制报文协议ICMP

    ICMP允许主机或路由器报告差错情况和提供有关异常情况的报告 不是高层协议 是IP层的协议 分为差错报告报文和查询报文两类 ICMP报文作为IP层数据报的数据 加上数据报的首部 组成IP数据报发送出去 ICMP报文直接封装在以太帧 数据链路
  • apache commons-io read-file

    文章目录 依赖
  • asp.net google地图+百度地图绘制行政区域图

    直接贴代码
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法

    简介 相信阿里云服务器ECS已被广大的企业和个人站长所使用 但对于之前没有使用过阿里云服务器的新手小白来说 无疑是一头雾水 今天呢 服务器吧小编就给刚接触阿里云ECS的新手小白带来快速入门阿里云服务器的方法 相信阿里云服务器ECS已被广大的
  • MySQL8新增管理端口

    简介 用过MySQL数据库朋友一定对 ERROR 1040 HY000 Too many connections 这个报错不陌生 出现这个报错的原因有两种情况 一种是单个用户的连接数超过 max user connections 参数定义值
  • 【考研复习】24王道数据结构课后习题代码|2.3线性表的链式表示

    文章目录 总结 01 递归删除结点 02 删除结点 03 反向输出 04 删除最小值 05 逆置 06 链表递增排序 07 删除区间值 08 找公共结点 09 增序输出链表 10 拆分链表 尾插 11 拆分链表 头插 12 删除相同元素 1
  • Python 生成随机的六位数

    首先给出代码 然后再分析代码中函数的意思 1 生成随机的六位数 import random str for i in range 6 ch chr random randrange ord 0 ord 9 1 str ch print st
  • 深度包检测(DPI)的记录

    20210301 0 引言 大概一年半之前 让学生整理过关于DPI的内容 当时让他部署过nDPI的DPDK版本 当时给我的DPI的材料也没仔细看 这里直接贴到这里来 材料中的内容应该也是从别的地方复制粘贴的 基本上就是一些显而易见的材料 1
  • LLVM编译

    欢迎到我的博客来阅读这篇文章 https qiu weidong github io 2022 05 01 llvm build Windows下编译LLVM 安装Visual Studio 首先需要下载Visual Studio Inst