LLVM编译

欢迎到我的博客来阅读这篇文章: 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 

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

你可能感兴趣的:(llvm,visual,studio,microsoft,c++,linux)