编译 llvm 的 libc++

编译 llvm 的 libc++

前置依赖(Ubuntu/Debian)

sudoaptupdatesudoaptinstall-ygitcmake ninja-build python3\gcc g++ binutils-dev libzstd-dev\zlib1g-dev libxml2-dev libedit-dev libncurses5-dev

1. 获取源码(Monorepo)

LLVM 现在使用单仓库(monorepo),clanglibc++libc++abilibunwind都在里面:

gitclone--depth1https://github.com/llvm/llvm-project.gitcdllvm-project

目录结构:

llvm-project/ ├── llvm/ # LLVM 核心 ├── clang/ # Clang 前端 ├── libcxx/ # libc++ 标准库 ├── libcxxabi/ # libc++abi 运行时 ├── libunwind/ # 栈展开库 ├── lld/ # 链接器 └── ...

2. 关键 CMake 配置

llvm-project根目录下执行:

cmake-Sllvm-Bbuild-GNinja\-DLLVM_ENABLE_PROJECTS="clang;lld"\-DLLVM_ENABLE_RUNTIMES="libcxx;libcxxabi;libunwind"\-DLLVM_TARGETS_TO_BUILD="Native"\-DCMAKE_BUILD_TYPE=Release\-DCMAKE_INSTALL_PREFIX=/usr/local/llvm\-DLLVM_ENABLE_LIBCXX=ON\-DLLVM_STATIC_LINK_CXX_STDLIB=OFF\-DCLANG_DEFAULT_CXX_STDLIB=libc++\-DLLVM_INSTALL_UTILS=ON\-DLLVM_ENABLE_TERMINFO=OFF
关键选项解释
选项作用
LLVM_ENABLE_PROJECTS="clang;lld"同时编译clanglld链接器
LLVM_ENABLE_RUNTIMES="libcxx;libcxxabi;libunwind"libc++、libc++abi、libunwind作为运行时一并构建
LLVM_ENABLE_LIBCXX=ONLLVM 自身在编译时也链接libc++而不是libstdc++
LLVM_STATIC_LINK_CXX_STDLIB=OFF动态链接 libc++(生成.so文件);设为ON则静态链接
CLANG_DEFAULT_CXX_STDLIB=libc++让编译出的clang++默认使用libc++,无需每次加-stdlib=libc++
LLVM_TARGETS_TO_BUILD="Native"只编译本机架构,加快编译速度;如需交叉编译可改为"X86;AArch64;ARM"
CMAKE_INSTALL_PREFIX=/usr/local/llvm安装路径,避免覆盖系统默认编译器

3. 编译与安装

# 编译(根据 CPU 核心数调整 -j)ninja-Cbuild -j$(nproc)# 安装到 /usr/local/llvmsudoninja-Cbuildinstall

注意:编译 LLVM 非常耗时,Release 模式下可能需要 30 分钟到数小时,建议至少预留 20GB 磁盘空间。


4. 验证与使用

检查编译出的 libc++.so
ls/usr/local/llvm/lib/libc++*# 应看到 libc++.so.1、libc++abi.so.1、libunwind.so.1 等
使用新编译的 clang++(默认已链接 libc++)
exportPATH=/usr/local/llvm/bin:$PATH# 直接编译,无需 -stdlib=libc++(因为设置了 CLANG_DEFAULT_CXX_STDLIB)clang++ hello.cpp-ohello# 验证动态依赖ldd hello|grepc++# 应显示 libc++.so.1,而不是 libstdc++.so.6
如果未设置CLANG_DEFAULT_CXX_STDLIB
clang++-stdlib=libc++ hello.cpp-ohello

5. 完整生产级配置(参考)

如果你需要更完整的配置(如包含compiler-rtbolt等):

cmake-Sllvm-Bbuild-GNinja\-DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra;lld;lldb"\-DLLVM_ENABLE_RUNTIMES="compiler-rt;libcxx;libcxxabi;libunwind"\-DLLVM_TARGETS_TO_BUILD="X86;AArch64;ARM;RISCV"\-DCMAKE_BUILD_TYPE=Release\-DCMAKE_INSTALL_PREFIX=/usr/local/llvm\-DLLVM_ENABLE_LIBCXX=ON\-DLLVM_STATIC_LINK_CXX_STDLIB=OFF\-DCLANG_DEFAULT_CXX_STDLIB=libc++\-DCLANG_DEFAULT_LINKER=lld\-DLLVM_INSTALL_UTILS=ON\-DLLVM_ENABLE_TERMINFO=OFF\-DLLVM_ENABLE_LIBXML2=OFF\-DLLVM_ENABLE_ZLIB=ON\-DLLVM_USE_LINKER=lld

常见问题

Q: 编译时提示找不到 libc++ 头文件?
A: 确保LLVM_ENABLE_RUNTIMES包含了libcxx;libcxxabi,且源码目录下确实有libcxx/libcxxabi/文件夹(monorepo 默认包含)。

Q: 编译出的 clang 还是链接了 libstdc++?
A: 检查LLVM_ENABLE_LIBCXX=ON是否生效,并确认安装后使用/usr/local/llvm/bin/clang++,而非系统默认的/usr/bin/clang++

Q: 如何完全自举(bootstrap)?
A: 先用系统 GCC 完成上述编译(Stage 1),然后用 Stage 1 的clang++作为CMAKE_C_COMPILER/CMAKE_CXX_COMPILER再编译一次,并确保加上-stdlib=libc++