Clang
Clang 是一个基于 LLVM 的 C/C++/Objective C/CUDA 编译器。最新版本以 "Apache 2.0 License with LLVM exceptions" 许可证分发。
安装
安装 clang 软件包。或者,从 Arch 用户仓库 安装 llvm-gitAUR 或 clang-minimal-gitAUR。
使用 Clang 构建软件包
通用设置
要更改构建软件包的默认编译器,编辑
/etc/makepkg.conf
... export CC=clang export CXX=clang++
要使用 libc++
作为 C++ 标准库 而不是 GCC 的 libstdc++
:安装 libc++ 软件包,然后在您的 /etc/makepkg.conf
中将 -stdlib=libc++
添加到 CXXFLAGS
。
对于 LTO 支持:安装 lld 软件包,然后在您的 /etc/makepkg.conf
中将 -fuse-ld=lld
添加到 LDFLAGS
。
如果您正在使用 debug
构建,您还需要从 DEBUG_CFLAGS
和 DEBUG_CXXFLAGS
中删除 -fvar-tracking-assignments
,因为 Clang 不支持它。
makepkg.conf
中的 Clang 行。Qt 软件包
Qt 软件包可能需要额外的设置。Qt 具有预定义的构建配置,称为 "mkspecs",默认为 Linux 上的 GCC。
在某些情况下,mkspec 将根据 CC
/CXX
变量自动设置为 linux-clang
。但在其他情况下(例如,直接调用 qmake
的软件包),它不会,因此我们可以显式设置它
/etc/makepkg.conf
export QMAKESPEC=linux-clang
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
技巧与诀窍
Bash 补全
为了启用 Bash 补全,安装 bash-completion 并在 Bash 启动文件 中 source /usr/share/clang/bash-autocomplete.sh
。
故障排除
堆栈保护器
clang 软件包默认启用 -fstack-protector-strong
。这种做法不应导致编译大多数程序出现任何问题,并以最小的代价提高整体安全性和鲁棒性。但是,在某些情况下,堆栈保护器 canary 在 TLS 中未初始化(例如,当您自己实现 _start
函数时)。在这种情况下,使用 -fstack-protector-strong
编译可能会导致段错误或其他意外错误。应该注意 clang 软件包与上游之间的差异。