使用自编译的C++
标准库#
不想使用系统自带的 C++ 库,需要自己编译一套 llvm 的 libc++.so
以及 STL
的时候,可以参考如下命令:
1
2
3
4
5
6
7
8
9
10
11
| cmake -G Ninja\
-DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra;lldb;lld"\
-DLLVM_ENABLE_RUNTIMES="libc;libunwind;libcxxabi;pstl;libcxx;compiler-rt;openmp;offload"\
-DLIBCXX_ENABLE_SHARED=ON\
-DLIBCXXABI_ENABLE_SHARED=ON\
-DLLVM_USE_LINKER=lld\
-DCMAKE_BUILD_TYPE=Release\
-DLLVM_BUILD_LLVM_DYLIB=ON\
-DLLVM_LINK_LLVM_DYLIB=ON\
-DCMAKE_INSTALL_PREFIX=/home/debian/tools/clang-llvm-21\
../llvm-project/llvm
|
编译完库之后,使用显式参数告诉clang++
使用自编译库:
1
| clang++ -stdlib=libc++ test.cpp -o test
|
使用ripgrep
查找libc++.so
所在目录:
1
2
3
4
5
6
7
8
9
| debian@debian:~/tools/clang-llvm-21$ rg --files | rg so | rg "libc++"
share/libc++/v1/std/memory_resource.inc
share/libc++/v1/std/source_location.inc
lib/libclang.so.21.0.0git
lib/aarch64-unknown-linux-gnu/libc++abi.so.1.0
lib/aarch64-unknown-linux-gnu/libc++.so
lib/aarch64-unknown-linux-gnu/libc++.modules.json
lib/aarch64-unknown-linux-gnu/libc++.so.1.0
lib/libclang-cpp.so.21.0git
|
使用ldd
或者运行可执行文件test
之前,需要先注入环境变量:
1
2
| # 仅供参考,这个目录应该是 libc++.so 所在的目录
export LD_LIBRARY_PATH=$HOME/tools/clang-llvm-21/lib/aarch64-unknown-linux-gnu/
|
阅读 libcxx 源码时配置 clangd 路径:#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| # ~/llvm4stl/libcxx/.clangd
CompileFlags:
Add:
- -I/home/debian/llvm4stl/libcxx/include
- -stdlib=libc++
- -std=c++20
- -D_LIBCPP_HARDENING_MODE=_LIBCPP_HARDENING_MODE_EXTENSIVE
Remove:
- -Werror
- -I/home/debian/llvm4stl/build/include/c++/v1
Diagnostics:
Suppress:
- using_decl_conflict
Index:
Background: Index
|
Floatzone 使用的 SPEC CPU 2017 配置#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
| # runcpu --config=asan_template --nobuild 500.perlbench
#--------- Global Settings -----------
label = infra-asan_O2
makeflags = -j16
reportable = no
strict_rundir_verify = no
teeout = yes
tune = base
#--------- How Many CPUs? ------------
intrate,fprate:
copies = 16
intspeed,fpspeed:
threads = 16
#--------- Compilers -----------------
default:
CC = /root/floatzone/llvm-default/bin/clang -O2 -Wno-int-conversion -fsanitize=address -fno-sanitize-address-use-after-scope -fsanitize-address-use-after-return=never -DSPEC_OPENMP -fopenmp -Wno-deprecated-non-prototype
CXX = /root/floatzone/llvm-default/bin/clang++ -O2 -Wno-int-conversion -fsanitize=address -fno-sanitize-address-use-after-scope -fsanitize-address-use-after-return=never
FC = /usr/bin/false
CLD = /root/floatzone/llvm-default/bin/clang -fsanitize=address -fno-sanitize-address-use-after-scope -fsanitize-address-use-after-return=never -fopenmp -L/root/floatzone/build/packages/rusage-counters/install/lib -Wl,--whole-archive -l:librusagecounters.a -Wl,--no-whole-archive
CXXLD = /root/floatzone/llvm-default/bin/clang++ -fsanitize=address -fno-sanitize-address-use-after-scope -fsanitize-address-use-after-return=never -fopenmp -L/root/floatzone/build/packages/rusage-counters/install/lib -Wl,--whole-archive -l:librusagecounters.a -Wl,--no-whole-archive
COPTIMIZE = -std=c99
CXXOPTIMIZE = -std=c++03
CC_VERSION_OPTION = --version
CXX_VERSION_OPTION = --version
FC_VERSION_OPTION = --version
#--------- Portability -----------------
default:
EXTRA_PORTABILITY = -DSPEC_LP64
500.perlbench_r,600.perlbench_s:
PORTABILITY = -DSPEC_LINUX_X64
523.xalancbmk_r,623.xalancbmk_s:
PORTABILITY = -DSPEC_LINUX
502.gcc_r,602.gcc_s=peak:
LDOPTIMIZE = -z muldefs
intrate,intspeed:
LDCFLAGS = -z muldefs
|