如何构建带有PSTL支持的libc++?解决clang工具链构建报错
构建带PSTL支持的libc++问题解决
问题背景
尝试构建独立Clang工具链,但libc++始终无法启用PSTL支持,执行的构建命令如下:
mkdir build && cd build cmake -G "Ninja" \ -DCMAKE_CXX_COMPILER=clang++ \ -DLLVM_USE_LINKER=lld \ -DLLVM_ENABLE_PROJECTS="clang;lld;lldb;libc" \ -DLLVM_TARGETS_TO_BUILD=Native \ -DCLANG_ENABLE_BOOTSTRAP=ON \ -DCMAKE_BUILD_TYPE=Release \ -DCLANG_DEFAULT_CXX_STDLIB=libc++ \ -DCLANG_DEFAULT_RTLIB=compiler-rt \ -DLLVM_ENABLE_RUNTIMES="compiler-rt;libcxx;libcxxabi;libunwind;pstl" \ -DLIBCXX_USE_COMPILER_RT=YES \ -DLIBCXXABI_USE_COMPILER_RT=YES \ -DLIBCXXABI_USE_LLVM_UNWINDER=YES \ -DBOOTSTRAP_CMAKE_BUILD_TYPE=Release \ -DBOOTSTRAP_LLVM_ENABLE_PROJECTS="clang;lld;lldb" \ -DBOOTSTRAP_LLVM_ENABLE_RUNTIMES="compiler-rt;libc;libcxx;libcxxabi;libunwind;pstl" \ -DBOOTSTRAP_CLANG_DEFAULT_CXX_STDLIB=libc++ \ -DBOOTSTRAP_CLANG_DEFAULT_RTLIB=compiler-rt \ -DBOOTSTRAP_LIBCXX_USE_COMPILER_RT=YES \ -DBOOTSTRAP_LIBCXXABI_USE_COMPILER_RT=YES \ -DBOOTSTRAP_LIBCXXABI_USE_LLVM_UNWINDER=YES \ -DBOOTSTRAP_LLVM_USE_LINKER=lld \ -DLIBUNWIND_USE_COMPILER_RT=Yes \ -DBOOTSTRAP_LIBUNWIND_USE_COMPILER_RT=Yes \ ../src/llvm ninja ninja stage2
构建过程中反复出现提示:
-- Could not find ParallelSTL, libc++abi will not attempt to use it but the build may fail if the libc++ in use needs it to be available. -- Parallel STL uses the serial backend
解决方案
要让libc++正确启用PSTL支持,需调整CMake参数,明确启用并行算法并指定PSTL作为后端,同时确保线程依赖配置正确:
1. 核心参数调整
在主CMake配置和BOOTSTRAP配置中添加以下关键参数:
- 启用libc++的并行算法支持:
-DLIBCXX_ENABLE_PARALLEL_ALGORITHMS=YES和对应的BOOTSTRAP参数 - 指定PSTL作为并行后端:
-DLIBCXX_PARALLEL_BACKEND=pstl和对应的BOOTSTRAP参数 - 启用线程库支持:
-DLIBCXX_HAS_PTHREAD_LIBRARY=YES和对应的BOOTSTRAP参数
2. 修改后的完整构建命令
mkdir build && cd build cmake -G "Ninja" \ -DCMAKE_CXX_COMPILER=clang++ \ -DLLVM_USE_LINKER=lld \ -DLLVM_ENABLE_PROJECTS="clang;lld;lldb;libc" \ -DLLVM_TARGETS_TO_BUILD=Native \ -DCLANG_ENABLE_BOOTSTRAP=ON \ -DCMAKE_BUILD_TYPE=Release \ -DCLANG_DEFAULT_CXX_STDLIB=libc++ \ -DCLANG_DEFAULT_RTLIB=compiler-rt \ -DLLVM_ENABLE_RUNTIMES="compiler-rt;libcxx;libcxxabi;libunwind;pstl" \ -DLIBCXX_USE_COMPILER_RT=YES \ -DLIBCXXABI_USE_COMPILER_RT=YES \ -DLIBCXXABI_USE_LLVM_UNWINDER=YES \ -DLIBCXX_ENABLE_PARALLEL_ALGORITHMS=YES \ -DLIBCXX_PARALLEL_BACKEND=pstl \ -DLIBCXX_HAS_PTHREAD_LIBRARY=YES \ -DBOOTSTRAP_CMAKE_BUILD_TYPE=Release \ -DBOOTSTRAP_LLVM_ENABLE_PROJECTS="clang;lld;lldb" \ -DBOOTSTRAP_LLVM_ENABLE_RUNTIMES="compiler-rt;libc;libcxx;libcxxabi;libunwind;pstl" \ -DBOOTSTRAP_CLANG_DEFAULT_CXX_STDLIB=libc++ \ -DBOOTSTRAP_CLANG_DEFAULT_RTLIB=compiler-rt \ -DBOOTSTRAP_LIBCXX_USE_COMPILER_RT=YES \ -DBOOTSTRAP_LIBCXXABI_USE_COMPILER_RT=YES \ -DBOOTSTRAP_LIBCXXABI_USE_LLVM_UNWINDER=YES \ -DBOOTSTRAP_LLVM_USE_LINKER=lld \ -DBOOTSTRAP_LIBCXX_ENABLE_PARALLEL_ALGORITHMS=YES \ -DBOOTSTRAP_LIBCXX_PARALLEL_BACKEND=pstl \ -DBOOTSTRAP_LIBCXX_HAS_PTHREAD_LIBRARY=YES \ -DLIBUNWIND_USE_COMPILER_RT=Yes \ -DBOOTSTRAP_LIBUNWIND_USE_COMPILER_RT=Yes \ ../src/llvm ninja ninja stage2
3. 验证PSTL集成效果
构建完成后,编写测试代码验证:
#include <vector> #include <algorithm> #include <execution> int main() { std::vector<int> v(1000); std::fill(std::execution::par, v.begin(), v.end(), 42); return 0; }
使用构建的Stage2 Clang编译:
./build/stage2/bin/clang++ test.cpp -std=c++20 -lpthread
若编译无报错,说明PSTL已成功集成到libc++中。
内容的提问来源于stack exchange,提问作者Leen Hawk
相关产品推荐
相关产品推荐

