Shd*_*dNx 9 c++ build llvm clang
具体来说,我想构建 Clang、lld、lldb、libc++ 和 compiler-rt,并将 Clang 配置为默认使用这些。我在 x86-64 Linux 发行版(Oracle Linux)上,所以我相信这应该得到支持。
这就是我所做的,经过多次尝试和大量的谷歌/文档阅读:
git clone https://github.com/llvm/llvm-project.git -b llvmorg-10.0.0
cd llvm-project
mkdir build
cd build
cmake \
-D CMAKE_BUILD_TYPE=Release \
-D CMAKE_C_FLAGS_RELEASE='-DNDEBUG -Ofast' \
-D CMAKE_CXX_FLAGS_RELEASE='-DNDEBUG -Ofast' \
-D CMAKE_INSTALL_PREFIX=/opt/llvm10-toolchain \
-D LLVM_ENABLE_WARNINGS=Off \
-D LLVM_TARGETS_TO_BUILD=X86 \
-D LLVM_ENABLE_PROJECTS="clang;clang-tools-extra;lld;lldb" \
-D LLVM_ENABLE_RUNTIMES="compiler-rt;libcxx;libcxxabi;libunwind" \
-D LLVM_INCLUDE_TOOLS=On \
-D LLVM_BUILD_TOOLS=On \
-D LLVM_INCLUDE_BENCHMARKS=Off \
-D LLVM_INSTALL_BINUTILS_SYMLINKS=On \
-D LLVM_INSTALL_CCTOOLS_SYMLINKS=On \
-D LLVM_APPEND_VC_REV=On \
-D LLVM_ENABLE_THREADS=On \
-D LLVM_ENABLE_LTO=On \
-D LLVM_ENABLE_BINDINGS=Off \
-D LLVM_LIBDIR_SUFFIX=64 \
-D LLVM_BUILD_32_BITS=Off \
-D LLVM_BUILD_LLVM_DYLIB=Off \
-D LLVM_INSTALL_TOOLCHAIN_ONLY=On \
-D CLANG_DEFAULT_LINKER=lld \
-D CLANG_DEFAULT_CXX_STDLIB=libc++ \
-D CLANG_DEFAULT_RTLIB=compiler-rt \
-D LIBCXX_USE_COMPILER_RT=On \
-D LIBCXXABI_USE_COMPILER_RT=On \
-D LIBCXXABI_USE_LLVM_UNWINDER=On \
-G Ninja \
../llvm
cmake --build .
cmake --build . --target install
Run Code Online (Sandbox Code Playgroud)
我没有使用引导程序,因为我在环境中安装了一个相当新的 GCC 并且处于活动状态(GCC 9.3.0)。
虽然构建成功了,但我最终得到了一个非功能性的 Clang:
> clang++ -v -std=c++17 -Wall -Wextra now.cpp -o now
clang version 10.0.0 (https://github.com/llvm/llvm-project.git d32170dbd5b0d54436537b6b75beaf44324e0c28)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /opt/llvm10-toolchain/bin
Found candidate GCC installation: /usr/lib/gcc/x86_64-redhat-linux/4.8.2
Found candidate GCC installation: /usr/lib/gcc/x86_64-redhat-linux/4.8.5
Selected GCC installation: /usr/lib/gcc/x86_64-redhat-linux/4.8.5
Candidate multilib: .;@m64
Candidate multilib: 32;@m32
Selected multilib: .;@m64
"/opt/llvm10-toolchain/bin/clang-10" -cc1 -triple x86_64-unknown-linux-gnu -emit-obj -mrelax-all -disable-free -disable-llvm-verifier -discard-value-names -main-file-name now.cpp -mrelocation-model static -mthread-model posix -mframe-pointer=all -fmath-errno -fno-rounding-math -masm-verbose -mconstructor-aliases -munwind-tables -target-cpu x86-64 -dwarf-column-info -fno-split-dwarf-inlining -debugger-tuning=gdb -v -resource-dir /opt/llvm10-toolchain/lib64/clang/10.0.0 -internal-isystem /opt/llvm10-toolchain/bin/../include/c++/v1 -internal-isystem /usr/local/include -internal-isystem /opt/llvm10-toolchain/lib64/clang/10.0.0/include -internal-externc-isystem /include -internal-externc-isystem /usr/include -Wall -Wextra -std=c++17 -fdeprecated-macro -fdebug-compilation-dir /home/gabor -ferror-limit 19 -fmessage-length 0 -fgnuc-version=4.2.1 -fobjc-runtime=gcc -fcxx-exceptions -fexceptions -fdiagnostics-show-option -fcolor-diagnostics -faddrsig -o /tmp/now-139cc8.o -x c++ now.cpp
clang -cc1 version 10.0.0 based upon LLVM 10.0.0 default target x86_64-unknown-linux-gnu
ignoring nonexistent directory "/include"
#include "..." search starts here:
#include <...> search starts here:
/opt/llvm10-toolchain/bin/../include/c++/v1
/usr/local/include
/opt/llvm10-toolchain/lib64/clang/10.0.0/include
/usr/include
End of search list.
"/opt/llvm10-toolchain/bin/ld.lld" --hash-style=gnu --eh-frame-hdr -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o now /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crt1.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crti.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/crtbegin.o -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5 -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64 -L/opt/llvm10-toolchain/bin/../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../.. -L/opt/llvm10-toolchain/bin/../lib -L/lib -L/usr/lib /tmp/now-139cc8.o -lc++ -lm /opt/llvm10-toolchain/lib64/clang/10.0.0/lib/linux/libclang_rt.builtins-x86_64.a -lc /opt/llvm10-toolchain/lib64/clang/10.0.0/lib/linux/libclang_rt.builtins-x86_64.a /usr/lib/gcc/x86_64-redhat-linux/4.8.5/crtend.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crtn.o
ld.lld: error: unable to find library -lc++
ld.lld: error: cannot open /opt/llvm10-toolchain/lib64/clang/10.0.0/lib/linux/libclang_rt.builtins-x86_64.a: No such file or directory
ld.lld: error: cannot open /opt/llvm10-toolchain/lib64/clang/10.0.0/lib/linux/libclang_rt.builtins-x86_64.a: No such file or directory
clang-10: error: linker command failed with exit code 1 (use -v to see invocation)
Run Code Online (Sandbox Code Playgroud)
为了便于阅读,以下是上面提到的链接器搜索目录,按顺序排列:
/opt/llvm10-toolchain/lib64/lib64/usr/lib64/usr/lib/opt/llvm10-toolchain/lib/lib/usr/lib但是,libc++ 存在于它不搜索的目录中:
> find /opt/llvm10-toolchain -type f -name 'libc++*'
/opt/llvm10-toolchain/lib64/x86_64-unknown-linux-gnu/c++/libc++.so.1.0
/opt/llvm10-toolchain/lib64/x86_64-unknown-linux-gnu/c++/libc++.so
/opt/llvm10-toolchain/lib64/x86_64-unknown-linux-gnu/c++/libc++.a
/opt/llvm10-toolchain/lib64/x86_64-unknown-linux-gnu/c++/libc++abi.so.1.0
/opt/llvm10-toolchain/lib64/x86_64-unknown-linux-gnu/c++/libc++abi.a
Run Code Online (Sandbox Code Playgroud)
至于libclang_rt.builtins-x86_64.a,确实存在类似的东西,但路径不同:
> find /opt/llvm10-toolchain -type f -name 'libclang_rt*'
/opt/llvm10-toolchain/lib/clang/10.0.0/lib/x86_64-unknown-linux-gnu/libclang_rt.builtins.a
Run Code Online (Sandbox Code Playgroud)
我也尝试将编译器 rt、libcxx 等从LLVM_ENABLE_RUNTIMESto 移动LLVM_ENABLE_PROJECTS,但如果我这样做,编译会在构建 libc++abi 时失败并显示错误消息:
/tmp/libc++abi.so.1.0.5xZLnU.ltrans0.ltrans.o::DW.ref.gcc_personality_v0:错误:未定义对'gcc_personality_v0'的引用
即使在它之前,在 CMake 配置期间,它似乎找到了它:
-- Looking for gcc_personality_v0 in gcc_s
-- Looking for gcc_personality_v0 in gcc_s - found
Run Code Online (Sandbox Code Playgroud)
我也对 LLVM 10.0.1-rc1 进行了相同的尝试,但没有任何区别。
小智 4
看起来配置中的某些内容已关闭。到目前为止,我不是 LLVM/clang 专家,所以以下是我未经教育的猜测:
clang++它选择了 version 中的 GCC 4.8.5)。确保运行时环境中的 GCC 与clang++编译时环境中的 GCC 相同。LLVM_INSTALL_TOOLCHAIN_ONLY=On作为一个选择而通过。在查看此站点时,似乎您的clang++调用所需的文件甚至不应该安装(尽管该补丁相当旧)。libclang_rt*可能是由 引起的。LLVM_LIBDIR_SUFFIX=64我建议再次构建和安装 LLVM 并仔细查看输出。其次,确保构建时和执行时的环境相同(如果您使用环境模块,在使用多个不同的工具链时我不太推荐,您可以为这种情况定义依赖项)。毕竟,如果没有构建日志和对环境的深入了解,真的很难判断,正如我所说:这些只是一些未经教育的猜测。