入门:构建和运行 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,当前步骤如下
- 获取必需的工具。
- 请参阅LLVM 系统入门 - 需求。
- 另请注意,Python 是运行测试套件所需的。请从以下地址获取:https://www.pythonlang.cn/downloads/
- 标准构建过程使用 CMake。请从以下地址获取:https://cmake.org/download/
- 检出 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
- 构建 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 页面。
- 在 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.
- 试用它(假设您将 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 -(输出本机机器代码)
- 运行测试套件
- make check-clang
使用 Visual Studio
以下内容详细介绍了在 Windows 上使用 Visual Studio 设置和构建 Clang
- 获取必需的工具
- 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, sed和find。gnuwin32 包是最古老的,也是测试最充分的方式来获取这些工具。但是,git 为 Windows 提供的 MSys 实用程序已知可以正常工作。Cygwin 过去曾成功过,但没有经过充分测试。如果您还没有从其他来源获取核心实用程序,请从http://getgnuwin32.sourceforge.net/获取 gnuwin32。
- 检出 LLVM 和 Clang
- git clone https://github.com/llvm/llvm-project.git
注意:一些 Clang 测试对行尾很敏感。确保检出文件不会将 LF 行尾转换为 CR+LF。如果您在 Windows 上使用 git,请确保您的core.autocrlf设置是 false。
- 运行 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 文件。
- 构建 Clang
- 在 Visual Studio 中打开 LLVM.sln。
- 构建 "clang" 项目以仅构建编译器驱动程序和前端,或构建 "ALL_BUILD" 项目以构建所有内容,包括工具。
- 试用它(假设您已将 llvm/debug/bin 添加到您的路径中)。(请参阅上面的运行示例。)
- 有关在 Windows 上运行回归测试的信息,请参阅在 clang 上进行开发 - 使用 Windows 上的 Visual Studio 进行测试。
在 Visual Studio 旁边使用 Ninja
我们建议想要最快增量构建的开发人员使用Ninja 构建系统。您可以使用生成的 Visual Studio 项目文件编辑 Clang 源代码,并在其旁边生成一个第二个构建目录,以通过以下步骤运行测试
- 按照上述步骤检出 clang 和 LLVM
- 打开具有适当环境的开发人员命令提示符。
- 如果您打开开始菜单并搜索 "命令提示符",您应该会看到 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
- mkdir build_ninja(或build,或使用您自己的组织)
- cd build_ninja
- set CC=cl(如果安装了 mingw GCC,则必须强制 CMake 选择 MSVC 而不是 mingw GCC)
- set CXX=cl
- cmake -GNinja -DLLVM_ENABLE_PROJECTS=clang ..\llvm
- ninja clang这将仅构建 clang。
- 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: