编译 llvm 的 libc++
前置依赖(Ubuntu/Debian)
sudoaptupdatesudoaptinstall-ygitcmake ninja-build python3\gcc g++ binutils-dev libzstd-dev\zlib1g-dev libxml2-dev libedit-dev libncurses5-dev1. 获取源码(Monorepo)
LLVM 现在使用单仓库(monorepo),clang、libc++、libc++abi、libunwind都在里面:
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" | 同时编译clang和lld链接器 |
LLVM_ENABLE_RUNTIMES="libcxx;libcxxabi;libunwind" | 把libc++、libc++abi、libunwind作为运行时一并构建 |
LLVM_ENABLE_LIBCXX=ON | 让LLVM 自身在编译时也链接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-ohello5. 完整生产级配置(参考)
如果你需要更完整的配置(如包含compiler-rt、bolt等):
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++。
