gpt4 book ai didi

c++ - 建立LLVM 10 C++工具链的问题

转载 作者:行者123 更新时间:2023-12-01 12:32:57 25 4
gpt4 key购买 nike

具体来说,我想构建Clang,lld,lldb,libc++和compile-rt,并配置Clang在默认情况下使用它们。我在x86-64 Linux发行版(Oracle Linux)上,所以我认为应该支持。

经过几次尝试和大量的Google/文档阅读之后,这就是我所做的事情:

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

我没有使用 bootstrap ,因为我已经在环境中安装了一个相当新的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)

为了提高可读性,以下是上述链接器搜索目录,顺序为:
  • /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

    至于 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

    我也尝试过将编译器-rt,libcxx等从 LLVM_ENABLE_RUNTIMES移到 LLVM_ENABLE_PROJECTS,但是如果这样做,在构建libc++ abi时编译失败并显示一条错误消息:

    /tmp/libc++abi.so.1.0.5xZLnU.ltrans0.ltrans.o::DW.ref.gcc_personality_v0: error: undefined reference to 'gcc_personality_v0'



    即使在此之前,在CMake配置期间,它似乎也可以找到它:
    -- Looking for gcc_personality_v0 in gcc_s
    -- Looking for gcc_personality_v0 in gcc_s - found

    我也尝试过使用LLVM 10.0.1-rc1进行相同操作,但是没有区别。

    最佳答案

    似乎配置中的某些内容已关闭。到目前为止,我还没有LLVM/clang专家,所以这是我没有根据的猜测:

  • 它没有选择正确的GCC(您提到您在编译LLVM时安装了最新的9.3.0 GCC并处于事件状态,但是在实际运行clang++时会选择4.8.5版本的GCC)。运行clang++时,请确保环境中的GCC与编译时相同。
  • 您正在传递LLVM_INSTALL_TOOLCHAIN_ONLY=On作为选项。在查看this site时,似乎甚至不应该安装clang++调用所需的文件(尽管该补丁相当旧)。
  • libclang_rt*的路径之间的差异可能是由LLVM_LIBDIR_SUFFIX=64引起的,尽管安装过程应正确处理这种情况。

  • 我建议再次构建和安装LLVM,并仔细查看输出。其次,确保构建和执行时的环境相同(如果您使用的是 environment modules,那么在使用多个不同的工具链时,我不能推荐足够的环境,您可以为这种情况定义依赖项)。毕竟,如我所说,如果没有构建日志和对环境的深入了解,很难说出来:这些只是一些没有根据的猜测。

    关于c++ - 建立LLVM 10 C++工具链的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62341390/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com