Skip to content

在WSL中编译LLVM源码并实现覆盖率统计

约 1716 字大约 6 分钟

2025-03-01

本文详细记录了我在WSL环境下编译LLVM 20.1.0源码并实现代码覆盖率统计的过程中踩过的坑,还包括了集成GTest和覆盖率分析的实战内容。

环境准备

本次实验基于WSL(Windows Subsystem for Linux)环境,推荐使用Ubuntu 22.04发行版。核心依赖包括:

  • CMake 3.20+
  • Ninja构建系统
  • GCC/G++ 11+
  • 至少16GB物理内存(可以扩展交换分区)
  • 50GB可用磁盘空间

建议提前安装LLVM编译依赖项:
sudo apt install cmake ninja-build gcc g++ python3 zlib1g-dev

源码获取

LLVM官方仓库下载20.1.0版本源码包并在WSL中解压

tar xvf llvm-project-llvmorg-20.1.0-rc3.tar.gz

可以使用Free Download Manager加速下载过程 源码下载截图

编译配置与优化

构建参数解析

mkdir build && cd build
cmake -G Ninja ../llvm \
  -DCMAKE_BUILD_TYPE=Release \          # 启用Release优化
  -DLLVM_ENABLE_PROJECTS="clang;compiler-rt" \  # 包含运行时库支持
  -DLLVM_USE_LINKER=gold \             # 使用gold链接器加速链接
  -DLLVM_TARGETS_TO_BUILD=X86 \        # 限定目标架构
  -DBUILD_SHARED_LIBS=ON               # 生成动态库节省空间

内存优化策略

这里有个小插曲:我在第一次执行ninja开始编译时,编译了十多分钟后遇到Killed signal terminated program cc1plus的错误,该错误通常是由于内存不足或交换分区(Swap)不足引起,因此需进行以下调整:

# 创建8GB交换文件(根据物理内存调整)
sudo dd if=/dev/zero of=/swapfile bs=1G count=8
sudo mkswap /swapfile
sudo swapon /swapfile

# 调整内存使用策略
sudo sysctl vm.swappiness=100  # 提高系统使用Swap的积极性

并行编译控制

ninja -j$(($(nproc)/2))  # 推荐使用物理核心数的50%
# 或保守方案(过高并行数(如-j128)可能导致内存争用)
ninja -j2  # 双线程编译

然后就是无尽的等待

编译耗时参考

  • 14核/16GB内存:约1.5小时

编译成功验证

编译完成后,执行如下指令以验证安装结果

./bin/clang --version # 仍然在build目录下执行这一命令

看到这样的输出表示编译成功

编译完成验证

环境配置

# ~/.bashrc追加
export PATH=/usr/local/libtorch/bin:$PATH:$LLVM_PATH
export LLVM_PATH=/home/ljcwsl/llvm-project-llvmorg-20.1.0-rc3/build/bin

# 立即生效
source ~/.bashrc

注意一开始我把LLVM_PATH写成了PATH,导致与上面的PATH重名,整个命令行都无法正确使用 环境变量配置

GTest集成与覆盖率分析实战

实战项目概览

.
├── my_lib.cpp
├── my_lib.h
├── run_coverage.sh
└── test_my_lib.cpp

0 directories, 4 files

测试库设计与实现

本项目构建了数学运算基础库my_lib用于测试,包含四类核心函数:整数加法运算、整数减法运算、质数判断、非负整数阶乘。

my_lib.h

测试用例开发策略

采用GTest框架编写测试集,对其进行白盒测试。

覆盖率分析系统构建

接下来编译和运行代码,生成覆盖率分析报告,因为指令比较复杂,所以我写了一个运行在Linux下的自动化测试脚本run_coverage.sh

覆盖率结果验证

执行测试脚本后生成GTest和覆盖率测试报告:

# 赋予脚本执行权限
chmod +x run_coverage.sh

# 执行完整流程
./run_coverage.sh

程序运行结果截图如下:

image.png

在浏览器中打开index.html,可以看到覆盖率分析报告,以及具体的运行次数统计 image.pngimage.png