入门:构建和运行 Clang

本页面为您提供了检出 Clang 和演示一些选项的最短路径。这应该能让您以最少的麻烦开始使用 Clang。如果您喜欢您看到的内容,请考虑加入Clang 社区。如果您遇到问题,请在LLVM 错误追踪器上提交错误报告。

发布版 Clang 版本

Clang 作为 LLVM 定期发布的一部分发布。您可以从https://llvm.net.cn/releases/下载发布版本。

Clang 还作为其各自打包系统的一部分,提供在所有主要 BSD 或 GNU/Linux 发行版中。从 Xcode 4.2 开始,Clang 是 Mac OS X 的默认编译器。

构建 Clang 并使用代码

在类 Unix 系统上

如果您想检出和构建 Clang,当前步骤如下

  1. 获取必需的工具。
  2. 检出 LLVM 项目
    • 将目录更改为要放置 llvm 目录的位置。
    • git clone https://github.com/llvm/llvm-project.git
    • 以上命令速度非常慢。可以通过创建浅克隆来加快速度。浅克隆节省存储空间并加快检出时间。这可以通过使用以下命令来完成
      • git clone --depth=1 https://github.com/llvm/llvm-project.git(使用此命令只能构建最新版本的 llvm)
      • 对于只想编译的普通用户来说,此命令可以正常工作。但如果有人后来成为贡献者,由于他们无法从浅克隆中推送代码,因此需要将其转换为完整克隆
        • cd llvm-project
        • git fetch --unshallow
  3. 构建 LLVM 和 Clang
    • cd llvm-project
    • mkdir build(不支持树内构建)
    • cd build
    • 这将在发布模式下构建 LLVM 和 Clang。或者,如果您需要调试构建,请将 Release 切换到 Debug。请参阅常用 cmake 变量以了解更多选项。
    • cmake -DLLVM_ENABLE_PROJECTS=clang -DCMAKE_BUILD_TYPE=Release -G "Unix Makefiles" ../llvm
    • make
    • 注意:对于后续的 Clang 开发,您只需运行make clang.
    • CMake 允许您为多个 IDE 生成项目文件:Xcode、Eclipse CDT4、CodeBlocks、Qt-Creator(使用 CodeBlocks 生成器)、KDevelop3。有关更多详细信息,请参阅使用 CMake 构建 LLVM 页面。
  4. 在 Linux 上,您可能需要 GCC 运行时库(例如crtbeginS.o、libstdc++.so)和 libstdc++ 头文件。一般来说,Clang 会检测与目标三元组匹配的知名 GCC 安装路径(在构建时配置(请参阅clang --version);由--target=)覆盖)并使用最大的版本。如果您的配置不符合任何标准场景,您可以设置--gcc-install-dir=到 GCC 安装目录(类似于/usr/lib/gcc/$triple/$major)。如果您的 GCC 安装在/usr/lib/gcc下,但使用不同的三元组,您可以设置--gcc-triple=$triple.
  5. 试用它(假设您将 llvm/build/bin 添加到您的路径中)
    • clang --help
    • clang file.c -fsyntax-only(检查正确性)
    • clang file.c -S -emit-llvm -o -(打印出未优化的 llvm 代码)
    • clang file.c -S -emit-llvm -o - -O3
    • clang file.c -S -O3 -o -(输出本机机器代码)
  6. 运行测试套件
    • make check-clang

使用 Visual Studio

以下内容详细介绍了在 Windows 上使用 Visual Studio 设置和构建 Clang

  1. 获取必需的工具
    • Git。源代码控制程序。请从以下地址获取:https://git.js.cn/download
    • CMake。这用于生成 Visual Studio 解决方案和项目文件。请从以下地址获取:https://cmake.org/download/
    • Visual Studio 2019 16.7 或更高版本
    • Python。它用于运行 clang 测试套件。请从以下地址获取:https://www.pythonlang.cn/download/
    • GnuWin32 工具Clang 和 LLVM 测试套件使用各种 GNU 核心实用程序,例如grep, sedfind。gnuwin32 包是最古老的,也是测试最充分的方式来获取这些工具。但是,git 为 Windows 提供的 MSys 实用程序已知可以正常工作。Cygwin 过去曾成功过,但没有经过充分测试。如果您还没有从其他来源获取核心实用程序,请从http://getgnuwin32.sourceforge.net/获取 gnuwin32。
  2. 检出 LLVM 和 Clang
    • git clone https://github.com/llvm/llvm-project.git

    注意:一些 Clang 测试对行尾很敏感。确保检出文件不会将 LF 行尾转换为 CR+LF。如果您在 Windows 上使用 git,请确保您的core.autocrlf设置是 false。

  3. 运行 CMake 生成 Visual Studio 解决方案和项目文件
    • cd llvm-project
    • mkdir build(用于构建而不污染源目录)
    • cd build
    • 如果您使用的是 Visual Studio 2019cmake -DLLVM_ENABLE_PROJECTS=clang -G "Visual Studio 16 2019" -A x64 -Thost=x64 ..\llvm
      -Thost=x64是必需的,因为 32 位链接器会耗尽内存。
    • 要生成 x86 二进制文件而不是 x64,请传递-A Win32.
    • 有关 CMake 其他配置选项的信息,请参阅LLVM CMake 指南
    • 如果成功,以上步骤将在build目录中创建 LLVM.sln 文件。
  4. 构建 Clang
    • 在 Visual Studio 中打开 LLVM.sln。
    • 构建 "clang" 项目以仅构建编译器驱动程序和前端,或构建 "ALL_BUILD" 项目以构建所有内容,包括工具。
  5. 试用它(假设您已将 llvm/debug/bin 添加到您的路径中)。(请参阅上面的运行示例。)
  6. 有关在 Windows 上运行回归测试的信息,请参阅在 clang 上进行开发 - 使用 Windows 上的 Visual Studio 进行测试

在 Visual Studio 旁边使用 Ninja

我们建议想要最快增量构建的开发人员使用Ninja 构建系统。您可以使用生成的 Visual Studio 项目文件编辑 Clang 源代码,并在其旁边生成一个第二个构建目录,以通过以下步骤运行测试

  1. 按照上述步骤检出 clang 和 LLVM
  2. 打开具有适当环境的开发人员命令提示符。
    • 如果您打开开始菜单并搜索 "命令提示符",您应该会看到 Visual Studio 创建的快捷方式来执行此操作。要使用本机 x64 工具,请选择名为 "适用于 VS 2017 的 x64 本机工具命令提示符" 的快捷方式。
    • 或者,启动一个常规的cmd提示符并运行适当的 vcvarsall.bat 命令。要获取 2017 x64 工具,这将是
      "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvarsall.bat" x64
  3. mkdir build_ninja(或build,或使用您自己的组织)
  4. cd build_ninja
  5. set CC=cl(如果安装了 mingw GCC,则必须强制 CMake 选择 MSVC 而不是 mingw GCC)
  6. set CXX=cl
  7. cmake -GNinja -DLLVM_ENABLE_PROJECTS=clang ..\llvm
  8. ninja clang这将仅构建 clang。
  9. ninja check-clang这将运行 clang 测试。

Clang 编译器驱动程序(GCC 的直接替代品)

clang工具是编译器驱动程序和前端,旨在成为gcc命令的直接替代品。以下是一些关于如何使用高级驱动程序的示例

$ cat t.c
#include <stdio.h>
int main(int argc, char **argv) { printf("hello world\n"); }
$ clang t.c
$ ./a.out
hello world

'clang' 驱动程序旨在尽可能接近 GCC,以最大限度地提高可移植性。两者之间的主要区别在于,Clang 默认使用 gnu99 模式,而 GCC 默认使用 gnu89 模式。如果您看到与内联函数相关的奇怪的链接时错误,请尝试将 -std=gnu89 传递给 clang。

使用 Clang 的示例

$ cat ~/t.c
typedef float V __attribute__((vector_size(16)));
V foo(V a, V b) { return a+b*a; }

预处理

$ clang ~/t.c -E
# 1 "/Users/sabre/t.c" 1

typedef float V __attribute__((vector_size(16)));

V foo(V a, V b) { return a+b*a; }

类型检查

$ clang -fsyntax-only ~/t.c

GCC 选项

$ clang -fsyntax-only ~/t.c -pedantic
/Users/sabre/t.c:2:17: warning: extension used
typedef float V __attribute__((vector_size(16)));
                ^
1 diagnostic generated.

从 AST 进行漂亮打印

注意,-cc1参数表示应运行编译器前端,而不是驱动程序。编译器前端具有几个额外的 Clang 特定功能,这些功能未通过 GCC 兼容驱动程序接口公开。

$ clang -cc1 ~/t.c -ast-print
typedef float V __attribute__(( vector_size(16) ));
V foo(V a, V b) {
   return a + b * a;
}

使用 LLVM 进行代码生成

$ clang ~/t.c -S -emit-llvm -o -
define <4 x float> @foo(<4 x float> %a, <4 x float> %b) {
entry:
         %mul = mul <4 x float> %b, %a
         %add = add <4 x float> %mul, %a
         ret <4 x float> %add
}
$ clang -fomit-frame-pointer -O3 -S -o - t.c # On x86_64
...
_foo:
Leh_func_begin1:
	mulps	%xmm0, %xmm1
	addps	%xmm1, %xmm0
	ret
Leh_func_end1: