一,Windows 下通过 CMAKE 搭建 LLVM 环境

Windows 下通过 CMAKE 搭建 LLVM 环境

  • [Windows 下通过 CMAKE 搭建 LLVM 环境](#Windows 下通过 CMAKE 搭建 LLVM 环境 "#windows-%E4%B8%8B%E9%80%9A%E8%BF%87-cmake-%E6%90%AD%E5%BB%BA-llvm-%E7%8E%AF%E5%A2%83")

    • 前因

    • 系统环境

    • [Let's Begin](#Let’s Begin "#lets-begin")

      • [获取 LLVM Project 源码](#获取 LLVM Project 源码 "#%E8%8E%B7%E5%8F%96-llvm-project-%E6%BA%90%E7%A0%81")
      • [使用 Vscode 打开&编译 LLVM Project](#使用 Vscode 打开&编译 LLVM Project "#%E4%BD%BF%E7%94%A8-vscode-%E6%89%93%E5%BC%80%E7%BC%96%E8%AF%91-llvm-project")
      • Build

本文主要介绍如何在 Windows 下通过 vscode 使用 Cmake+Ninja 来编译 LLVM 源码,从而搭建 LLVM 环境以及生成 clang 的 Tools 相关库。

前因

  1. 为啥要编译源码,预编译包它不香么?

    • 确实 LLVM 官方已经提供了 Win32 版本的预编译包,但是我尝试安装了9.0.1版本与10.0.0版本,它居然都没有 clang 的 libTooling 相关的库,这就很难受了所以为了能使用 clang Tools 只好从头做起,如果哪位同学知道为啥不提供 libtooling 这些库的原因请告诉下,谢谢~😂。
  2. 为啥非得在 Windows 下,Linux 不是更方便?

    • 我在 Linux 下也搭建了一下 9.0.1 版本,直接在 LLVM 官网上下载对应版本与系统的预编译包,解压及用、库又全又好用😀。
    • 但是由于我使用的 Ubuntu WSL 子系统,通过 Vscode 的 WSL 插件连接上后发现对 c++ 插件支持貌似有问题,代码颜色渲染信息不全,不清楚是 GCC 编译器问题还是啥原因,导致强迫症患者不想在 WSL 系统直接开发,知道原因的大佬求告知,反正当前的项目是通过 CMake 管理,所以决定在 windows 下开发完成后在移植到 Linux 下。
  3. 废话就说这么多现在开始。


我是分割线


系统环境

  1. Win10 操作系统,已经安装了 VS2017 全家桶。包括最最重要的 msvc2017_64 工具包、Vscode、以及 camke(version 3.12.18081601-MSVC_2) 工具。当然如果你不想装那么巨大的 IDE,也可以单独安装 mingw + cmake 网上的教程也很多。
  2. 环境变量正确配置,例如在 powershell 或 cmd 中敲 cmake.exe -version 可以打印出安装的工具版本,确保你的编译器相关工具也可以正常工作。

Let's Begin

获取 LLVM Project 源码

查找了一些网上的资料发现下载源码超级麻烦,要么是需要安装 svn 、要么去官网下载,并且需要下载这个源码然后在下那个源码,一眼看过去就迷失在了未知的海洋里嘞。因此在这里推荐直接下载 llvm-project 源码合集大礼包,可以避免很多问题。

  1. 如果你是在担忧源码编译出来过大以及多余你不需要的模块,那么不用担心,llvm 的贴心的准备了裁剪编译命令,帮助你只构建需要的模块。

  2. 此时你已经拿到了源码包,开开心心的右键 -> 解压到当前文件夹 -> 等待 -> ... -> 错误:无法创建文件。 What???

    • 我遇到的问题主要是由于压缩包中包含软连接,当前 Windows 下文件系统不支持创建,导致错误。最终我是直接通过 WSL 子系统,使用命令 tar 解压的。所以如果在 Windows 下解压失败的话可以尝试在 Linux 中解压然后在拷贝出来。

使用 Vscode 打开&编译 LLVM Project

在打开之前,需要介绍一个很重要的工具,它就是 CmakeTools,作为 Vscode 的插件,在管理使用 cmake 构建的工程非常好用,可以方便的配置使用的编译器、编译模式、使用GDB、控制生成模块。因此如果你不想耗费精力去管理工程或者输入编译命令,那么我强烈建议你安装一个。

  1. 安装好 CmakeTools 工具后,通过 vscode 打开 llvm-project 的源码文件夹。如果你的环境变量正确,编译器、cmake 工具能正确搜索到,那么 CmakeTools 会自动使用 cmake 工具配置当前项目,但是由于 llvm-project 的源码根目录中并没有 CMakeLists.txt,因此 CmakeTools 工具会提示一个错误。

    • 解决的办法就在根目录中的 README.md 中,可以看到几个步骤,其中 mkdir build 的步骤其实 CmakeTools 默认就会在当前文件夹根目录创建 build 用于保存编译中间文件因此略过。主要看到其中 cmake 命令对应的 .../llvm 目录,可知作为入口的 CMakeLists.txt 就在 llvm 目录中。
    • 因此配置 cmaketools 的根目录为 llvm 目录。
  2. 这时你的 CmakeTools 应该就可以正确的工作了。以下就是我当前环境中的 CmakeTools 在配置 CMakeLists.txt 时的输出信息,可以看到最终是配置成功的。

    sh 复制代码
    [variant] 已加载一组新变量
    [kit] 已成功从 C:\Users\Administrator\AppData\Local\CMakeTools\cmake-tools-kits.json 加载 14 工具包
    [main] 正在配置文件夹: llvm-project-10.0.0
    [cmake] clang project is enabled
    [cmake] clang-tools-extra project is enabled
    [cmake] compiler-rt project is disabled
    [cmake] debuginfo-tests project is disabled
    [cmake] libc project is disabled
    [cmake] libclc project is disabled
    [cmake] libcxx project is disabled
    [cmake] libcxxabi project is disabled
    [cmake] libunwind project is disabled
    [cmake] lld project is disabled
    [cmake] lldb project is disabled
    [cmake] llgo project is disabled
    [cmake] mlir project is disabled
    [cmake] openmp project is disabled
    [cmake] parallel-libs project is disabled
    [cmake] polly project is disabled
    [cmake] pstl project is disabled
    [cmake] Could NOT find Z3: Found unsuitable version "0.0.0", but required is at least "4.7.1" (found Z3_LIBRARIES-NOTFOUND)
    [cmake] Could NOT find Backtrace (missing: Backtrace_LIBRARY Backtrace_INCLUDE_DIR)
    [cmake] Native target architecture is X86
    [cmake] Threads enabled.
    [cmake] Doxygen disabled.
    [cmake] Go bindings disabled.
    [cmake] Ninja version: 1.8.2
    [cmake] Could NOT find OCaml (missing: OCAMLFIND OCAML_VERSION OCAML_STDLIB_PATH)
    [cmake] OCaml bindings disabled.
    [cmake] LLVM host triple: x86_64-pc-windows-msvc
    [cmake] LLVM default target triple: x86_64-pc-windows-msvc
    [cmake] Using Release VC++ CRT: MD
    [cmake] Constructing LLVMBuild project information
    [cmake] LLVMHello ignored -- Loadable modules not supported on this platform.
    [cmake] Targeting AArch64
    [cmake] Targeting AMDGPU
    [cmake] Targeting ARM
    [cmake] Targeting BPF
    [cmake] Targeting Hexagon
    [cmake] Targeting Lanai
    [cmake] Targeting Mips
    [cmake] Targeting MSP430
    [cmake] Targeting NVPTX
    [cmake] Targeting PowerPC
    [cmake] Targeting RISCV
    [cmake] Targeting Sparc
    [cmake] Targeting SystemZ
    [cmake] Targeting WebAssembly
    [cmake] Targeting X86
    [cmake] Targeting XCore
    [cmake] Clang version: 10.0.0
    [cmake] PrintFunctionNames ignored -- Loadable modules not supported on this platform.
    [cmake] AnnotateFunctions ignored -- Loadable modules not supported on this platform.
    [cmake] BugpointPasses ignored -- Loadable modules not supported on this platform.
    [cmake] Bye ignored -- Loadable modules not supported on this platform.
    [cmake] TestPlugin ignored -- Loadable modules not supported on this platform.
    [cmake] -- Version: 0.0.0
    [cmake] -- Performing Test HAVE_GNU_POSIX_REGEX -- failed to compile
    [cmake] -- Performing Test HAVE_POSIX_REGEX -- failed to compile
    [cmake] CMake Warning at utils/benchmark/CMakeLists.txt:244 (message):
    [cmake]   Using std::regex with exceptions disabled is not fully supported
    [cmake]
    [cmake]
    [cmake] -- Performing Test HAVE_STEADY_CLOCK -- success
    [cmake] Configuring done
    [cmake] Generating done
  3. 这里如果想要编译其他模块例如 [cmake] clang project is enabled,还需要在 CmakeTools 配置的时候传入一些参数,如图。参数的含义可以看根目录中 README.md 中有详细的解释。这里有个问题就是像我配置的第一项 compiler-rt 其实依旧是 disabled 的,怀疑是 LLVM 的 CMakeLists.txt 解析有 BUG 或者我哪里配置的还是不对,请了解的大佬告知。

    • 这里有一点需要注意,CMakeTools 默认也是编译 Debug 模式,但是这对电脑内存要求较高,耗时同样很长,因此我这里配置参数编译的是 Release 版本。
  4. 最终当这一切配置完成,点击 CmakeTools 中的 生成 按钮,就可以开始编译了。

Build

最终编译完成后,会在根目录的 build 文件夹中生成许多文件,其中 lib 就包括所有生成的库文件。

注意 LLVM 中有一些头文件时在编译过程中针对平台生成,也在 build 目录中,当使用库时发现头文件找不到的情况,可以去 build 中搜索下查找。

至此,LLVM 就成功编译完成,接下来就可以开心的搞事情了。

相关推荐
CYRUS_STUDIO12 天前
使用 Frida Stalker 反 OLLVM 算法还原
android·逆向·llvm
xjz18421 个月前
实现第一个语言前端LLVM教程(九)增加错误调试信息
llvm
xjz18421 个月前
实现第一个语言前端LLVM教程(七)扩展语言:可变变量
llvm
Ciderw2 个月前
LLVM编译器简介
c++·golang·编译·编译器·gcc·llvm·基础设施
天枢破军2 个月前
【AI】零代码-A卡780M核显在Windows平台运行ollama跑端侧大模型
llvm·deepseek
witton3 个月前
macOS使用LLVM官方发布的tar.xz来安装Clang编译器
vscode·macos·cmake·clang·llvm·qtcreator·clang++
高铭杰3 个月前
Postgresql源码(141)JIT系列分析汇总
postgresql·jit·llvm
Lhuu(重开版4 个月前
2024硬件科技协会LLVM第二次考核题解
算法·ast·llvm
Eloudy4 个月前
C CPP 中注释的正则表达式
正则表达式·llvm
CYRUS_STUDIO5 个月前
使用 opt 优化 LLVM IR,定制 clang 实现函数名加密
c++·性能优化·llvm