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编译 的相关文章

  • 何时使用 =default 使析构函数默认?

    尽管对构造函数使用 default 对我来说很清楚 即强制编译器在其他构造函数存在时创建默认构造函数 但我仍然无法理解这两种类型的析构函数之间的区别 那些使用 default 的 那些没有显式定义并由编译器自动生成的 我唯一想到的是 gro
  • 为什么在创建矩阵类时使用向量不好?

    对于我的矩阵类 我做了 template
  • 如何在 C# / .NET 中创建内存泄漏[重复]

    这个问题在这里已经有答案了 可能的重复 托管代码中是否可能存在内存泄漏 特别是 C 3 0 https stackoverflow com questions 6436620 is it possible to have a memory
  • 根据 N 个值中最小的一个返回不同的结果

    不确定如何使标题更具描述性 所以我只是从一个例子开始 我使用下面的代码位 它从枚举中选择一个方向 具体取决于四个轴中哪一个与给定方向相比形成最小角度 static Direction VectorToDirection Vector2 di
  • GCC 和 ld 找不到导出的符号...但它们在那里

    我有一个 C 库和一个 C 应用程序 尝试使用从该库导出的函数和类 该库构建良好 应用程序可以编译 但无法链接 我得到的错误遵循以下形式 app source file cpp text 0x2fdb 对 lib namespace Get
  • 如何在 QTabWidget Qt 中展开选项卡

    我有一个QTabWidget像这个 但我想展开选项卡以 填充 整个小部件宽度 如下所示 我怎样才能做到这一点 我在用Qt 5 3 2 and Qt 创建者 3 2 1 Update 我尝试使用setExpanding功能 ui gt myT
  • 在 JSQMessagesViewController 中显示 LocationMediaItem

    我刚刚尝试实施LocationMediaItem in my Xamarin iOS应用程序使用JSQMessagesViewController 一切都很顺利 唯一的问题是UICollectionView应该显示位置的单元格永远停留在加载
  • 为什么 set_symmetry_difference 无法与比较器一起使用?

    Example program include
  • C# 构建一个 webservice 方法,它接受 POST 方法,如 HttpWebRequest 方法

    我需要一个接受 POST 方法的 Web 服务 访问我的服务器正在使用 POST 方法 它向我发送了一个 xml 我应该用一些 xml 进行响应 另一方面 当我访问他时 我已经使用 HttpWebRequest 类进行了管理 并且工作正常
  • 如何从文本文件读取整数到数组

    这就是我想做的 我对此有些不满 但我希望你能容忍我 这对我来说是一个非常新的概念 1 在我的程序中 我希望创建一个包含 50 个整数的数组来保存来自文件的数据 我的程序必须获取用户的文档文件夹的路径 2 文件的名称为 grades txt
  • C++ php 和静态库

    我创建了一个library a 其中包含 cpp 和 h 文件 其中包含很多类 嵌套类和方法 我想在 php 示例中包含这个静态库并尝试使用它 我想提一下 我是 php 新手 我已经在 test cpp 文件中测试了我的 libray a
  • 给出 5 个参数,但在终端中只得到 3 个参数

    我想将一个文件传递给一个c 程序 如果我在 IDE 中执行此操作 test string string lt test txt return argc 5 但在终端上我刚刚得到argc 3 看来 这是因为 什么是 lt 意思是 我正在使用
  • 如何在标准 WPF ListView 中启用 UI 虚拟化

    我正在使用 NET 4 5 VS2012 并且我有一个 ListView 看起来像这样
  • C# 中的 strstr() 等效项

    我有两个byte 我想找到第二个的第一次出现byte 在第一个byte 或其中的一个范围 我不想使用字符串来提高效率 翻译第一个byte to a string会效率低下 基本上我相信就是这样strstr 在 C 中做 最好的方法是什么 这
  • .NET Core 中的跨平台文件名处理

    如何处理文件名System IO以跨平台方式运行类以使其在 Windows 和 Linux 上运行 例如 我编写的代码在 Windows 上完美运行 但它不会在 Ubuntu Linux 上创建文件 var tempFilename Dat
  • IEnumerable.Except 不起作用,那么我该怎么办?

    我有一个 linq to sql 数据库 非常简单 我们有 3 个表 项目和用户 有一个名为 User Projects 的连接表将它们连接在一起 我已经有了一个获得的工作方法IEnumberable
  • 更改 Windows Phone 系统托盘颜色

    有没有办法将 Windows Phone 上的系统托盘颜色从黑色更改为白色 我的应用程序有白色背景 所以我希望系统托盘也是白色的 您可以在页面 XAML 中执行此操作
  • C++ Streambuf 方法可以抛出异常吗?

    我正在尝试找到一种方法来获取读取或写入流的字符数 即使存在错误并且读 写结束时间较短 该方法也是可靠的 我正在做这样的事情 return stream rdbuf gt sputn buffer buffer size 但如果streamb
  • 如何在 DropDownList 中保留空格 - ASP.net MVC Razor 视图

    我在视图中通过以下方式绑定我的模型 问题是我的项目文本是格式化文本 单词之间有空格 如下所示 123 First 234 00 123 AnotherItem 234 00 123 Second 234 00 我想保留此项目文本中的空格 即
  • 矩阵到数组 C#

    这将是转换方阵的最有效方法 例如 1 2 3 4 5 6 7 8 9 into 1 2 3 4 5 6 7 8 9 in c 我在做 int array2D new int 1 2 3 4 5 6 7 8 9 int array1D new

随机推荐

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

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