LLVM学习教程:1 安装 LLVM llvm clang安装
liebian365 2024-10-23 13:54 24 浏览 0 评论
为了学习如何使用 LLVM,最好从源代码编译 LLVM 开始。LLVM 是一个总称项目,其 GitHub 仓库包含了所有属于 LLVM 项目的源代码。每个 LLVM 项目都位于仓库的顶级目录中。除了克隆仓库外,您的系统还必须安装构建系统所需的所有工具。在本章中,您将了解以下主题:
准备先决条件,这将向您展示如何设置构建系统 从源代码克隆仓库并构建,这将涵盖如何获取 LLVM 源代码,以及如何使用 CMake 和 Ninja 编译和安装 LLVM 核心库和 clang 自定义构建过程,这将讨论影响构建过程的各种可能性 编译 LLVM 与安装二进制文件 您可以从各种来源安装 LLVM 二进制文件。如果您使用的是 Linux,则您的发行版包含 LLVM 库。为什么还要自己编译 LLVM?
首先,并非所有安装包都包含开发 LLVM 所需的所有文件。自己编译和安装 LLVM 可以避免这个问题。另一个原因源于 LLVM 高度可定制的事实。通过构建 LLVM,您将了解如何自定义 LLVM,这将使您能够在将 LLVM 应用程序带到另一个平台时诊断可能出现的问题。最后,在本书的第三部分,您将扩展 LLVM 本身,为此,您需要自己构建 LLVM 的技能。
然而,对于最初几步,完全避免编译 LLVM 是完全可以的。如果您想走这条路,那么您只需要按照下一节中描述的方式安装先决条件。
注意
许多 Linux 发行版将 LLVM 分为几个包。请确保您安装了开发包。例如,在 Ubuntu 上,您需要安装 llvm-dev 包。还请确保您安装了 LLVM 17。对于其他版本,本书中的示例可能需要更改。
准备先决条件 要使用 LLVM,您的开发系统应该运行一个常见的操作系统,如 Linux、FreeBSD、macOS 或 Windows。您可以以不同的模式构建 LLVM 和 clang。启用调试符号的构建可能占用高达 30 GB 的空间。所需的磁盘空间严重依赖于所选的构建选项。例如,仅构建 LLVM 核心库,以发布模式为目标,仅针对一个平台,需要大约 2 GB 的空闲磁盘空间,这是所需的最低限度。
为了减少编译时间,拥有一个快速的 CPU(例如具有 2.5 GHz 时钟速度的四核 CPU)和快速的 SSD 也是有帮助的。甚至可以在 Raspberry Pi 这样的小型设备上构建 LLVM —— 只是需要很长时间。本书中的示例是在一台搭载 2.7 GHz 时钟速度的 Intel 四核 CPU、40 GB RAM 和 2.5 TB SSD 磁盘空间的笔记本电脑上开发的。这个系统非常适合开发任务。
您的开发系统必须安装一些先决条件软件。让我们回顾一下这些软件包的最小所需版本。
要从 GitHub 检出源代码,您需要 Git (https://git-scm.com/)。没有特定版本的要求。GitHub 帮助页面建议至少使用 1.17.10 版本。由于过去发现的已知安全问题,建议使用最新可用版本,即撰写时的 2.39.1 版本。
LLVM 项目使用 CMake (https://cmake.org/) 作为构建文件生成器。至少需要 3.20.0 版本。CMake 可以为各种构建系统生成构建文件。在本书中,使用 Ninja (https://ninja-build.org/) 是因为它快速且在所有平台上都可用。建议使用最新版本 1.11.1。
显然,您还需要一个 C/C++ 编译器。LLVM 项目是用基于 C++17 标准的现代 C++ 编写的。需要一个符合标准的编译器和标准库。以下是已知与 LLVM 17 兼容的编译器:
gcc 7.1.0 或更高版本 clang 5.0 或更高版本 Apple clang 10.0 或更高版本 Visual Studio 2019 16.7 或更高版本 提示
请注意,随着 LLVM 项目的进一步开发,编译器的要求最有可能发生变化。一般来说,您应该使用系统上可用的最新编译器版本。
Python (https://python.org/) 在生成构建文件和运行测试套件期间使用。它至少应该是 3.8 版本。
尽管本书没有涵盖,但您可能需要使用 Make 而不是 Ninja。在这种情况下,您需要使用 GNU Make (https://www.gnu.org/software/make/) 版本 3.79 或更高版本。两种构建工具的使用非常相似。在下面描述的场景中,只需将每个命令中的 ninja 替换为 make 即可。
LLVM 还依赖于 zlib 库 (https://www.zlib.net/)。您应该至少安装了 1.2.3.4 版本。像往常一样,我们建议使用最新版本,即 1.2.13。
安装先决条件软件的最简单方法是使用操作系统的包管理器。在接下来的部分中,将显示为最流行的操作系统安装软件所需的命令。
Ubuntu Ubuntu 22.04 使用 apt 包管理器。大多数基本实用程序已经安装;缺少的只是开发工具。要一次性安装所有包,您需要输入以下命令:
$ sudo apt -y install gcc g++ git cmake ninja-build zlib1g-dev
Fedora 和 RedHat Fedora 37 和 RedHat Enterprise Linux 9 的包管理器称为 dnf。像 Ubuntu 一样,大多数基本实用程序已经安装。要一次性安装所有包,您需要输入以下命令:
$ sudo dnf –y install gcc gcc-c++ git cmake ninja-build \
zlib-devel
FreeBSD 在 FreeBSD 13 或更高版本上,您必须使用 pkg 包管理器。与基于 Linux 的系统不同,FreeBSD 已经安装了 clang 编译器。要一次性安装所有其他包,您需要输入以下命令:
$ sudo pkg install –y git cmake ninja zlib-ng
OS X 对于 OS X 的开发,最好从 Apple 商店安装 Xcode。虽然本书中没有使用 Xcode IDE,但它带有所需的 C/C++ 编译器和支持实用程序。对于其他工具的安装,可以使用包管理器 Homebrew (https://brew.sh/)。要一次性安装所有包,您需要输入以下命令:
$ brew install git cmake ninja zlib
Windows 像 OS X 一样,Windows 没有包管理器。对于 C/C++ 编译器,您需要下载 Visual Studio Community 2022 (https://visualstudio.microsoft.com/vs/community/),这对于个人使用是免费的。请确保您安装了名为 Desktop Development with C++ 的工作负载。您可以使用包管理器 Scoop (https://scoop.sh/) 安装其他包。按照网站上的说明安装 Scoop 后,您从 Windows 菜单中打开 x64 Native Tools Command Prompt for VS 2022。要安装所需的包,您需要输入以下命令:
$ scoop install git cmake ninja python gzip bzip2 coreutils
$ scoop bucket add extras
$ scoop install zlib
请仔细查看 Scoop 的输出。对于 Python 和 zlib 包,它建议添加一些注册表键。这些条目是必要的,以便其他软件可以找到这些包。要添加注册表键,您最好复制并粘贴 Scoop 的输出,如下所示:
$ %HOMEPATH%\scoop\apps\python\current\install-pep-514.reg
$ %HOMEPATH%\scoop\apps\zlib\current\register.reg
在每个命令之后,注册表编辑器会弹出一个消息窗口,询问您是否真的想要导入这些注册表键。您需要点击“是”以完成导入。现在所有先决条件都已安装。
对于本书中的所有示例,您必须使用 x64 Native Tools Command Prompt for VS 2022。使用此命令提示符,编译器会自动添加到搜索路径。
提示
LLVM 代码库非常大。为了舒适地导航源代码,我们建议使用允许您跳转到类定义并搜索源代码的 IDE。我们发现 Visual Studio Code (https://code.visualstudio.com/download),这是一个可扩展的跨平台 IDE,非常舒适易用。然而,这并不是遵循本书示例的要求。
克隆仓库并从源代码构建 准备好构建工具后,您现在可以从 GitHub 检出所有 LLVM 项目并构建 LLVM。这个过程在所有平台上基本相同:
配置 Git。 克隆仓库。 创建构建目录。 生成构建系统文件。 最后,构建并安装 LLVM。 让我们从配置 Git 开始。
配置 Git LLVM 项目使用 Git 进行版本控制。如果您之前没有使用过 Git,那么在继续之前,您应该先对 Git 进行一些基本配置:设置用户名和电子邮件地址。如果您提交更改,这两个信息都会被使用。
您可以使用以下命令检查 Git 中是否已配置了电子邮件和用户名:
$ git config user.email
$ git config user.name
上述命令将输出您在使用 Git 时已经设置的电子邮件和用户名。然而,如果您是第一次设置用户名和电子邮件,可以输入以下命令进行首次配置。在以下命令中,您可以简单地将 Jane 替换为您的名字,将 jane@email.org 替换为您的电子邮件:
$ git config --global user.email "jane@email.org"
$ git config --global user.name "Jane"
这些命令更改了全局 Git 配置。在 Git 仓库中,您可以通过不指定 --global 选项来覆盖这些值。
默认情况下,Git 使用 vi 编辑器来编写提交信息。如果您更喜欢其他编辑器,那么可以以类似的方式更改配置。要使用 nano 编辑器,您输入以下命令:
$ git config --global core.editor nano
有关 Git 的更多信息,请参见 Git 版本控制手册 (https://www.packtpub.com/product/git-version-control-cookbook-second-edition/9781789137545)。
现在您已准备好从 GitHub 克隆 LLVM 仓库。
克隆仓库 克隆仓库的命令在所有平台上基本相同。只有在 Windows 上,建议关闭自动转换行尾。
在所有非 Windows 平台上,您输入以下命令来克隆仓库:
$ git clone https://github.com/llvm/llvm-project.git
只有在 Windows 上,添加选项以禁用自动转换行尾。在这里,您输入以下命令:
$ git clone --config core.autocrlf=false \
https://github.com/llvm/llvm-project.git
这个 Git 命令将 GitHub 上的最新源代码克隆到名为 llvm-project 的本地目录中。现在使用以下命令将当前目录更改为新的 llvm-project 目录:
$ cd llvm-project
目录中包含了所有 LLVM 项目,每个项目都有自己的目录。最值得注意的是,LLVM 核心库位于 llvm 子目录中。LLVM 项目使用分支进行后续的发布开发(“release/17.x”)和标签(“llvmorg-17.0.1”)来标记某个特定发布。使用前面的克隆命令,您将获得当前的开发状态。本书使用 LLVM 17。要检出 LLVM 17 的第一个发布版本到名为 llvm-17 的分支,您输入以下命令:
$ git checkout -b llvm-17 llvmorg-17.0.1
通过前面的步骤,您克隆了整个仓库并从标签创建了一个分支。这是最灵活的方法。
Git 还允许您只克隆一个分支或一个标签(包括历史记录)。使用 git clone --branch release/17.x https://github.com/llvm/llvm-project,您只克隆 release/17.x 分支及其历史记录。然后您就有了 LLVM 17 发布分支的最新状态,所以如果您需要确切的发布版本,您只需要像之前一样从发布标签创建一个分支。使用附加的 --depth=1 选项,这在 Git 中被称为浅克隆,您可以防止克隆历史记录。这节省了时间和空间,但显然限制了您可以在本地执行的操作,包括基于发布标签检出分支。
创建构建目录 与许多其他项目不同,LLVM 不支持内联构建,需要一个单独的构建目录。最容易的做法是在 llvm-project 目录内创建,这是您当前的目录。让我们将构建目录命名为 build,以简化操作。在这里,Unix 和 Windows 系统的命令不同。在类 Unix 系统上,您使用以下命令:
$ mkdir build
在 Windows 上,使用以下命令:
$ md build
现在您准备好在这个目录中使用 CMake 工具创建构建系统文件了。
生成构建系统文件 为了生成编译 LLVM 和 clang 的构建系统文件,使用 Ninja,您运行以下命令:
$ cmake -G Ninja -DCMAKE_BUILD_TYPE=Release \
-DLLVM_ENABLE_PROJECTS=clang -B build -S llvm
-G 选项告诉 CMake 为哪个系统生成构建文件。该选项的常用值如下:
Ninja – 为 Ninja 构建系统 Unix Makefiles – 为 GNU Make Visual Studio 17 VS2022 – 为 Visual Studio 和 MS Build Xcode – 为 Xcode 项目
使用 -B 选项,您告诉 CMake 构建目录的路径。同样,您使用 -S 选项指定源目录。生成过程可以通过设置各种变量来影响,这些变量使用 -D 选项设置。通常,它们以 CMAKE_(如果由 CMake 定义)或 LLVM_(如果由 LLVM 定义)为前缀。
如前所述,我们还对同时编译 clang 和 LLVM 感兴趣。通过 LLVM_ENABLE_PROJECTS=clang 变量设置,这允许 CMake 生成 clang 的构建文件以及 LLVM。此外,CMAKE_BUILD_TYPE=Release 变量告诉 CMake 它应该为发布构建生成构建文件。
-G 选项的默认值取决于您的平台,默认的构建类型取决于工具链。但是,您可以使用环境变量定义自己的偏好。CMAKE_GENERATOR 变量控制生成器,CMAKE_BUILD_TYPE 变量指定构建类型。如果您使用 bash 或类似的 shell,那么您可以使用以下命令设置变量:
$ export CMAKE_GENERATOR=Ninja
$ export CMAKE_BUILD_TYPE=Release
如果您使用的是 Windows 命令提示符,那么您可以使用以下命令设置变量:
$ set CMAKE_GENERATOR=Ninja
$ set CMAKE_BUILD_TYPE=Release
有了这些设置,创建构建系统文件的命令就变成了以下这样,更容易输入:
$ cmake -DLLVM_ENABLE_PROJECTS=clang -B build -S llvm
您将在“自定义构建过程”部分找到有关 CMake 变量的更多信息。
编译和安装 LLVM 生成构建文件后,可以使用以下命令编译 LLVM 和 clang:
$ cmake –-build build
该命令在后台运行 Ninja,因为我们告诉 CMake 在配置步骤中生成 Ninja 文件。但是,如果您为支持多个构建配置的系统(如 Visual Studio)生成构建文件,则需要使用 --config 选项指定要用于构建的配置。根据硬件资源,此命令的运行时间从 15 分钟(拥有大量 CPU 核心、内存和快速存储的服务器)到几个小时(具有有限内存的双核心 Windows 笔记本电脑)不等。
默认情况下,Ninja 利用所有可用的 CPU 核心。这对编译速度有好处,但可能会阻止其他任务的运行;例如,在 Windows 笔记本电脑上,当 Ninja 运行时几乎不可能上网。幸运的是,您可以使用 -j 选项限制资源使用。
假设您有四个 CPU 核心可用,Ninja 只应该使用两个(因为您有并行任务要运行);然后您使用此命令进行编译:
$ cmake --build build –j2
编译完成后,最佳实践是运行测试套件以检查一切是否按预期工作:
$ cmake --build build --target check-all
再次,此命令的运行时间根据可用的硬件资源而有很大差异。check-all Ninja 目标运行所有测试用例。为包含测试用例的每个目录生成目标。使用 check-llvm 而不是 check-all 运行 LLVM 测试而不是 clang 测试;check-llvm-codegen 仅运行来自 LLVM 的 CodeGen 目录中的测试(即,llvm/test/CodeGen 目录)。
您也可以进行快速的手动检查。LLVM 应用程序之一是 llc,LLVM 编译器。如果您使用 -version 选项运行它,它会显示 LLVM 版本、主机 CPU 和所有支持的架构:
$ build/bin/llc --version
如果您在编译 LLVM 时遇到麻烦,那么您应该参考“开始使用 LLVM 系统”文档中的“常见问题”部分 (https://releases.llvm.org/17.0.1/docs/GettingStarted.html#common-problems) 以解决典型问题。
作为最后一步,您可以安装二进制文件:
$ cmake --install build
在类 Unix 系统上,安装目录是 /usr/local。在 Windows 上,使用 C:\Program Files\LLVM。这当然可以更改。下一节解释了如何进行更改。
自定义构建过程 CMake 系统在 CMakeLists.txt 文件中使用项目描述。顶级文件位于 llvm 目录中,llvm/CMakeLists.txt。其他目录也有 CMakeLists.txt 文件,在生成过程中递归包含。
基于项目描述中提供的信息,CMake 检查已安装的编译器,检测库和符号,并创建构建系统文件,例如 build.ninja 或 Makefile(取决于所选的生成器)。还可以定义可重用的模块,例如,一个函数来检测 LLVM 是否已安装。这些脚本放置在特殊的 cmake 目录(llvm/cmake)中,在生成过程中自动搜索。
构建过程可以通过定义 CMake 变量来自定义。使用命令行选项 -D 将变量设置为值。这些变量在 CMake 脚本中使用。CMake 自身定义的变量几乎总是以 CMAKE_ 为前缀,这些变量可以在所有项目中使用。LLVM 定义的变量以 LLVM_ 为前缀,但只有在项目定义中包含 LLVM 的使用时才能使用。
由 CMake 定义的变量 一些变量会根据环境变量的值进行初始化。最值得注意的是 CC 和 CXX,它们定义了用于构建的 C 和 C++ 编译器。CMake 会尝试自动定位 C 和 C++ 编译器,使用当前的 shell 搜索路径。它会选取找到的第一个编译器。如果您安装了多个编译器,例如 gcc 和 clang,或者 clang 的不同版本,那么这可能不是您想要用于构建 LLVM 的编译器。 假设您想使用 clang17 作为 C 编译器,使用 clang++17 作为 C++ 编译器。那么,您可以在 Unix shell 中以以下方式调用 CMake:
$ CC=clang17 CXX=clang++17 cmake –B build –S llvm
这只为 cmake 的调用设置了环境变量的值。如果需要,您可以为编译器可执行文件指定绝对路径。
CC 是 CMake 变量 CMAKE_C_COMPILER 的默认值,CXX 是 CMAKE_CXX_COMPILER 的默认值。而不是使用环境变量,您可以直接设置 CMake 变量。这等同于前面的调用:
$ cmake –DCMAKE_C_COMPILER=clang17 \
-DCMAKE_CXX_COMPILER=clang++17 –B build –S llvm
CMake 定义的其他有用变量如下:
变量名称 | 用途 |
CMAKE_INSTALL_PREFIX | 这是安装期间预先添加到每个路径的前缀。默认值是 Unix 上的 /usr/local 和 Windows 上的 C:\Program Files<Project>。要将 LLVM 安装在 /opt/llvm 目录中,您指定 -DCMAKE_INSTALL_PREFIX=/opt/llvm。二进制文件被复制到 /opt/llvm/bin,库文件被复制到 /opt/llvm/lib 等。 |
CMAKE_BUILD_TYPE | 不同类型的构建需要不同的设置。例如,调试构建需要指定生成调试符号的选项,并且通常链接到系统库的调试版本。相比之下,发布构建使用优化标志,并链接到库的生产版本。此变量仅用于只能处理一种构建类型的构建系统,例如 Ninja 或 Make。对于 IDE 构建系统,生成所有变体,并且您必须使用 IDE 的机制在构建类型之间切换。可能的值为:DEBUG(带有调试符号的构建)、RELEASE(优化速度的构建)、RELWITHDEBINFO(带有调试符号的发布构建)、MINSIZEREL(优化大小的构建)。默认构建类型从环境变量 CMAKE_BUILD_TYPE 中获取。如果未设置此变量,则默认值取决于所使用的工具链,通常为空。为了生成发布构建的构建文件,您指定 -DCMAKE_BUILD_TYPE=RELEASE。 |
CMAKE_C_FLAGS | CMAKE_CXX_FLAGS |
CMAKE_MODULE_PATH | 这指定了搜索 CMake 模块的附加目录。在搜索默认目录之前,会搜索指定的目录。该值是目录的分号分隔列表。 |
PYTHON_EXECUTABLE | 如果未找到 Python 解释器,或者在安装了多个版本的情况下选择了错误的解释器,您可以将此变量设置为 Python 二进制文件的路径。只有在包含 CMake 的 Python 模块时(对于 LLVM 是这样),此变量才有效。 |
CMake 提供了内置的帮助,用于变量。--help-variable var 选项打印了有关 var 变量的帮助。例如,您可以通过键入以下内容来获取 CMAKE_BUILD_TYPE 的帮助:
$ cmake --help-variable CMAKE_BUILD_TYPE
您也可以使用以下命令列出所有变量:
$ cmake --help-variable-list
这个列表非常长。您可能希望将输出管道传输到 more 或类似的程序。
使用 LLVM 定义的构建配置变量 LLVM 定义的构建配置变量的工作原理与 CMake 定义的变量相同,只是没有内置帮助。最有用的变量如下表所示,它们被分为对首次安装 LLVM 的用户有用的变量和对更高级的 LLVM 用户有用的变量。
对首次安装 LLVM 的用户有用的变量
变量名称 | 用途 |
LLVM_TARGETS_TO_BUILD | LLVM 支持为不同的 CPU 架构生成代码。默认情况下,所有这些目标都会构建。使用此变量可以指定要构建的目标列表,用分号分隔。当前目标有 AArch64、AMDGPU、ARM、AVR、BPF、Hexagon、Lanai、LoongArch、Mips、MSP430、NVPTX、PowerPC、RISCV、Sparc、SystemZ、VE、WebAssembly、X86 和 XCore。all 可以用作所有目标的简写。名称是区分大小写的。要仅启用 PowerPC 和 System Z 目标,您指定 -DLLVM_TARGETS_TO_BUILD="PowerPC;SystemZ"。 |
LLVM_EXPERIMENTAL_TARGETS_TO_BUILD | 除了官方目标外,LLVM 源代码树还包含实验性目标。这些目标正在开发中,通常还不支持后端的完整功能。当前的实验性目标列表是 ARC、CSKY、DirectX、M68k、SPIRV 和 Xtensa。要构建 M68k 目标,您指定 -D LLVM_EXPERIMENTAL_TARGETS_TO_BUILD=M68k。 |
LLVM_ENABLE_PROJECTS | 这是您想要构建的项目列表,用分号分隔。项目的源代码必须与 llvm 目录同级(并排布局)。当前列表是 bolt、clang、clang-tools-extra、compiler-rt、cross-project-tests、libc、libclc、lld、lldb、mlir、openmp、polly 和 pstl。all 可以用作此列表中所有项目的简写。此外,您还可以在此处指定 flang 项目。由于一些特殊的构建要求,它尚未成为 all 列表的一部分。要与 LLVM 一起构建 clang 和 bolt,您指定 -DLLVM_ENABLE_PROJECT="clang;bolt"。 |
高级 LLVM 用户的变量
变量名称 | 用途 |
LLVM_ENABLE_ASSERTIONS | 如果设置为 ON,则启用断言检查。这些检查有助于发现错误,在开发过程中非常有用。默认值为 DEBUG 构建为 ON,否则为 OFF。要启用断言检查(例如对于 RELEASE 构建),您指定 –DLLVM_ENABLE_ASSERTIONS=ON。 |
LLVM_ENABLE_EXPENSIVE_CHECKS | 这会启用一些成本较高的检查,这些检查可能会显著降低编译速度或消耗大量内存。默认值为 OFF。要启用这些检查,您指定 -DLLVM_ENABLE_EXPENSIVE_CHECKS=ON。 |
LLVM_APPEND_VC_REV | LLVM 工具(如 llc)在给出 –version 命令行选项时,会显示它们所基于的 LLVM 版本以及其他信息。这个版本信息基于 LLVM_REVISION C 宏。默认情况下,不仅是 LLVM 版本,当前的 Git 哈希也是版本信息的一部分。如果您正在跟踪主分支的开发,这将非常有用,因为它清楚地表明工具基于哪个 Git 提交。如果不需要,那么可以用 –DLLVM_APPEND_VC_REV=OFF 关闭它。 |
LLVM_ENABLE_THREADS | 如果检测到线程库(通常是 pthreads 库),LLVM 会自动包含线程支持。此外,在这种情况下,LLVM 假定编译器支持 TLS(线程本地存储)。如果您不希望线程支持或您的编译器不支持 TLS,那么您可以用 -DLLVM_ENABLE_THREADS=OFF 关闭它。 |
LLVM_ENABLE_EH | LLVM 项目不使用 C++ 异常处理,因此默认情况下关闭异常支持。此设置可能与您的项目链接的其他库不兼容。如果需要,您可以通过指定 –DLLVM_ENABLE_EH=ON 来启用异常支持。 |
LLVM_ENABLE_RTTI | LLVM 使用轻量级、自建系统进行运行时类型信息(RTTI)。默认情况下关闭 C++ RTTI 的生成。像异常处理支持一样,这可能与其他库不兼容。要启用 C++ RTTI 的生成,您指定 –DLLVM_ENABLE_RTTI=ON。 |
LLVM_ENABLE_WARNINGS | 编译 LLVM 应该尽可能不生成警告消息。因此,默认情况下启用打印警告消息的选项。要关闭它,您指定 –DLLVM_ENABLE_WARNINGS=OFF。 |
LLVM_ENABLE_PEDANTIC | LLVM 源代码应该符合 C/C++ 语言标准;因此,默认情况下启用了源代码的严格检查。如果可能,还会禁用特定于编译器的扩展。要反转此设置,您指定 –DLLVM_ENABLE_PEDANTIC=OFF。 |
LLVM_ENABLE_WERROR | 如果设置为 ON,则所有警告都被视为错误——一旦找到警告,编译就会中止。这有助于发现源代码中的所有剩余警告。默认情况下,它被关闭。要打开它,您指定 –DLLVM_ENABLE_WERROR=ON。 |
LLVM_OPTIMIZED_TABLEGEN | 通常,tablegen 工具的构建选项与 LLVM 的其他部分相同。同时,tablegen 用于生成代码生成器的大部分代码。结果是,在调试构建中,tablegen 要慢得多,显著增加了编译时间。如果将此选项设置为 ON,则即使对于调试构建,tablegen 也会以开启优化的方式编译,可能减少编译时间。默认为 OFF。要打开它,您指定 –DLLVM_OPTIMIZED_TABLEGEN=ON。 |
LLVM_USE_SPLIT_DWARF | 如果构建编译器是 gcc 或 clang,则打开此选项将指示编译器在单独的文件中生成 DWARF 调试信息。对象文件的减小大小显著减少了调试构建的链接时间。默认为 OFF。要打开它,您指定 -LLVM_USE_SPLIT_DWARF=ON。 |
注意
LLVM 定义了许多 CMake 变量。您可以在 LLVM 文档中找到完整列表,网址是 https://releases.llvm.org/17.0.1/docs/CMake.html#llvm-specific-variables。前面的列表只包含您最有可能需要的变量。
总结 在本章中,您准备了开发机器以编译 LLVM。您克隆了 GitHub 仓库并编译了自己的 LLVM 和 clang 版本。构建过程可以通过 CMake 变量进行自定义。您了解了有用变量及其如何更改的知识,有了这些知识,您可以根据需要调整 LLVM。
在下一节中,我们将更仔细地查看编译器的结构。我们将探索编译器内部的不同组件以及其中发生的不同类型的分析——具体来说,是词法、语法和语义分析。最后,我们也将简要触及与 LLVM 后端进行代码生成的接口。
相关推荐
- 精品博文嵌入式6410中蓝牙的使用
-
BluetoothUSB适配器拥有一个BluetoothCSR芯片组,并使用USB传输器来传输HCI数据分组。因此,LinuxUSB层、BlueZUSB传输器驱动程序以及B...
- win10跟这台计算机连接的前一个usb设备工作不正常怎么办?
-
前几天小编闲来无事就跑到网站底下查看粉丝朋友给小编我留言询问的问题,还真的就给小编看到一个问题,那就是win10跟这台计算机连接的一个usb设备运行不正常怎么办,其实这个问题的解决方法时十分简单的,接...
- 制作成本上千元的键盘,厉害在哪?
-
这是稚晖君亲自写的开源资料!下方超长超详细教程预警!!全文导航:项目简介、项目原理说明、硬件说明、软件说明项目简介瀚文智能键盘是一把我为自己设计的——多功能、模块化机械键盘。键盘使用模块化设计。左侧的...
- E-Marker芯片,USB数据线的“性能中枢”?
-
根据线缆行业的研究数据,在2019年搭载Type-C接口的设备出货量已达到20亿台,其中80%的笔记本电脑和台式电脑采用Type-C接口,50%的智能手机和平板电脑也使用Type-C接口。我们都知道,...
- ZQWL-USBCANFD二次开发通讯协议V1.04
-
修订历史:1.功能介绍1.1型号说明本文档适用以下型号: ZQWL-CAN(FD)系列产品,USB通讯采用CDC类实现,可以在PC机上虚拟出一个串口,串口参数N,8,1格式,波特率可以根据需要设置(...
- win10系统无法识别usb设备怎么办(win10不能识别usb)
-
从驱动入手,那么win10系统无法识别usb设备怎么办呢?今天就为大家分享win10系统无法识别usb设备的解决方法。1、右键选择设备管理器,如图: 2、点击更新驱动程序,如图: 3、选择浏览...
- 微软七月Win8.1可选补丁有内涵,含大量修复
-
IT之家(www.ithome.com):微软七月Win8.1可选补丁有内涵,含大量修复昨日,微软如期为Win7、Win8.1发布7月份安全更新,累计为6枚安全补丁,分别修复总计29枚安全漏洞,其中2...
- 如何从零开始做一个 USB 键盘?(怎么制作usb)
-
分两种情况:1、做一个真正的USB键盘,这种设计基本上不涉及大量的软件编码。2、做一个模拟的USB键盘,实际上可以没有按键功能,这种的需要考虑大量的软件编码,实际上是一个单片机。第一种设计:买现成的U...
- 电脑识别U盘失败?5个实用小技巧,让你轻松搞定USB识别难题
-
电脑识别U盘失败?5个实用小技巧,让你轻松搞定USB识别难题注意:有些方法会清除USB设备里的数据,请谨慎操作,如果不想丢失数据,可以先连接到其他电脑,看能否将数据复制出来,或者用一些数据恢复软件去扫...
- 未知usb设备设备描述符请求失败怎么解决
-
出现未知daousb设备设备描述符请求失du败解决办zhi法如下:1、按下Windows+R打开【运行】;2、在版本运行的权限输入框中输入:services.msc按下回车键打开【服务】;2、在服务...
- 读《飘》47章20(飘每章概括)
-
AndAhwouldn'tleaveMissEllen'sgrandchildrenfornotrashystep-patobringup,never.Here,Ah...
- 英翻中 消失的过去 37(消失的英文怎么说?)
-
翻译(三十七):消失的过去/茱迪o皮考特VanishingActs/JodiPicoult”我能做什么?“直到听到了狄利亚轻柔的声音,我才意识到她已经在厨房里站了好一会儿了。当她说话的时候,...
- RabbitMQ 延迟消息实战(rabbitmq如何保证消息不被重复消费)
-
现实生活中有一些场景需要延迟或在特定时间发送消息,例如智能热水器需要30分钟后打开,未支付的订单或发送短信、电子邮件和推送通知下午2:00开始的促销活动。RabbitMQ本身没有直接支持延迟...
- Java对象拷贝原理剖析及最佳实践(java对象拷贝方法)
-
作者:宁海翔1前言对象拷贝,是我们在开发过程中,绕不开的过程,既存在于Po、Dto、Do、Vo各个表现层数据的转换,也存在于系统交互如序列化、反序列化。Java对象拷贝分为深拷贝和浅拷贝,目前常用的...
- 如何将 Qt 3D 渲染与 Qt Quick 2D 元素结合创建太阳系行星元素?
-
Qt组件推荐:QtitanRibbon:遵循MicrosoftRibbonUIParadigmforQt技术的RibbonUI组件,致力于为Windows、Linux和MacOSX提...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- wireshark怎么抓包 (75)
- qt sleep (64)
- cs1.6指令代码大全 (55)
- factory-method (60)
- sqlite3_bind_blob (52)
- hibernate update (63)
- c++ base64 (70)
- nc 命令 (52)
- wm_close (51)
- epollin (51)
- sqlca.sqlcode (57)
- lua ipairs (60)
- tv_usec (64)
- 命令行进入文件夹 (53)
- postgresql array (57)
- statfs函数 (57)
- .project文件 (54)
- lua require (56)
- for_each (67)
- c#工厂模式 (57)
- wxsqlite3 (66)
- dmesg -c (58)
- fopen参数 (53)
- tar -zxvf -c (55)
- 速递查询 (52)