Clang

来自 ArchWiki

Clang 是一个基于 LLVMC/C++/Objective C/CUDA 编译器。最新版本以 "Apache 2.0 License with LLVM exceptions" 许可证分发。

安装

安装 clang 软件包。或者,从 Arch 用户仓库 安装 llvm-gitAURclang-minimal-gitAUR

使用 Clang 构建软件包

本文或章节可能需要与 makepkg 合并。

注意: 用于 makepkg 的编译器标志(在 Talk:Clang 中讨论)

通用设置

要更改构建软件包的默认编译器,编辑

/etc/makepkg.conf
...
export CC=clang
export CXX=clang++

要使用 libc++ 作为 C++ 标准库 而不是 GCClibstdc++:安装 libc++ 软件包,然后在您的 /etc/makepkg.conf 中将 -stdlib=libc++ 添加到 CXXFLAGS

对于 LTO 支持:安装 lld 软件包,然后在您的 /etc/makepkg.conf 中将 -fuse-ld=lld 添加到 LDFLAGS

如果您正在使用 debug 构建,您还需要从 DEBUG_CFLAGSDEBUG_CXXFLAGS 中删除 -fvar-tracking-assignments,因为 Clang 不支持它。

注意: 对于指定了 GCC 特定构建选项的软件包,可能会出现构建错误,这需要编辑源代码包、PKGBUILD 或注释掉 makepkg.conf 中的 Clang 行。

Qt 软件包

Qt 软件包可能需要额外的设置。Qt 具有预定义的构建配置,称为 "mkspecs",默认为 Linux 上的 GCC

在某些情况下,mkspec 将根据 CC/CXX 变量自动设置为 linux-clang。但在其他情况下(例如,直接调用 qmake 的软件包),它不会,因此我们可以显式设置它

/etc/makepkg.conf
export QMAKESPEC=linux-clang
注意: 某些软件包将需要安装 llvm,因为 linux-clang 配置为使用 llvm-ar 等工具。

Rust 软件包

每当 clang 设置为系统默认编译器时,Rust 需要配置为使用 clang 作为链接器,用于通常作为构建 Rust 应用程序过程一部分编译的 C 代码。

为此,需要在 /etc/makepkg.conf.d/rust.conf 中指定 clang(以及可选的 lld)。

例如,要使用 clang 和 lld

/etc/makepkg.conf.d/rust.conf
RUSTFLAGS="-Cforce-frame-pointers=yes -Clinker=clang -Clink-arg=-fuse-ld=lld"

使用静态分析器

要分析一个项目,只需在您的构建命令前放置单词 scan-build。例如

$ scan-build make

如果您的项目已经编译,scan-build 将不会重建,也不会分析它。要强制重新编译和分析,请使用 -B 开关

$ scan-build make -B

也可以分析特定文件

$ scan-build gcc -c t1.c t2.c

技巧与诀窍

本文或章节需要扩充。

原因: 描述 ClangFormatClang-TidyClang-Include-Fixer 的基本用法。(在 Talk:Clang 中讨论)

Bash 补全

为了启用 Bash 补全,安装 bash-completion 并在 Bash 启动文件 中 source /usr/share/clang/bash-autocomplete.sh

故障排除

堆栈保护器

clang 软件包默认启用 -fstack-protector-strong。这种做法不应导致编译大多数程序出现任何问题,并以最小的代价提高整体安全性和鲁棒性。但是,在某些情况下,堆栈保护器 canary 在 TLS 中未初始化(例如,当您自己实现 _start 函数时)。在这种情况下,使用 -fstack-protector-strong 编译可能会导致段错误或其他意外错误。应该注意 clang 软件包与上游之间的差异。

参见