代码之家  ›  专栏  ›  技术社区  ›  Benjamin Buch

如何通过LLVMs build_docker_image.sh构建默认为libc++的clang?

  •  1
  • Benjamin Buch  · 技术社区  · 6 年前

    我想用CLAN 6和LBC+++构建一个DOCKER容器作为默认C++标准库。我想包括(并使用)LLVM项目clang、libcxx、libcxxabi、lld和compiler-rt。

    要将libc++设置为默认值,我使用了CMAKE选项 CLANG_DEFAULT_CXX_STDLIB=libc++ (另外 DCLANG_DEFAULT_RTLIB=compiler-rt 默认为编译器rt)。第一阶段的构建确实有效,但似乎没有安装libc++:

    $ git clone https://github.com/llvm-mirror/llvm.git
    $ cd llvm
    $ git checkout release_60
    $ utils/docker/build_docker_image.sh -s debian8 \
        -d "clang" -t "6" --branch branches/release_60 \
        -p compiler-rt -p libcxxabi -p libcxx -p clang \
        -i stage2-install-compiler-rt \
        -i stage2-install-libcxxabi \
        -i stage2-install-libcxx \
        -i stage2-install-clang \
        -i stage2-install-clang-headers -- \
        -DCMAKE_BUILD_TYPE=Release \
        -DCLANG_DEFAULT_CXX_STDLIB=libc++ \
        -DCLANG_DEFAULT_RTLIB=compiler-rt \
        -DLIBCXXABI_USE_LLVM_UNWINDER=YES \
        -DCLANG_ENABLE_BOOTSTRAP=ON \
        -DBOOTSTRAP_CMAKE_BUILD_TYPE=Release \
        -DBOOTSTRAP_CLANG_DEFAULT_CXX_STDLIB=libc++ \
        -DBOOTSTRAP_CLANG_DEFAULT_RTLIB=compiler-rt \
        -DBOOTSTRAP_LIBCXX_USE_COMPILER_RT=YES \
        -DBOOTSTRAP_LIBCXXABI_USE_COMPILER_RT=YES \
        -DCLANG_BOOTSTRAP_TARGETS="install-compiler-rt;install-libcxxabi;install-libcxx;install-clang;install-clang-headers"
    

    在第二阶段构建时,我得到:

    [...]
    -- The C compiler identification is Clang 6.0.1
    -- The CXX compiler identification is Clang 6.0.1
    -- The ASM compiler identification is unknown
    -- Found assembler: /tmp/clang-build/build/./bin/clang
    -- Check for working C compiler: /tmp/clang-build/build/./bin/clang
    -- Check for working C compiler: /tmp/clang-build/build/./bin/clang -- works
    -- Detecting C compiler ABI info
    -- Detecting C compiler ABI info - done
    -- Detecting C compile features
    -- Detecting C compile features - done
    -- Check for working CXX compiler: /tmp/clang-build/build/./bin/clang++
    -- Check for working CXX compiler: /tmp/clang-build/build/./bin/clang++ -- broken
    CMake Error at /usr/local/share/cmake-3.7/Modules/CMakeTestCXXCompiler.cmake:44 (message):
      The C++ compiler "/tmp/clang-build/build/./bin/clang++" is not able to
      compile a simple test program.
    
      It fails with the following output:
    
       Change Dir: /tmp/clang-build/build/tools/clang/stage2-bins/CMakeFiles/CMakeTmp
    
    
    
      Run Build Command:"/usr/bin/ninja" "cmTC_d8e88"
    
      [1/2] Building CXX object CMakeFiles/cmTC_d8e88.dir/testCXXCompiler.cxx.o
    
      [2/2] Linking CXX executable cmTC_d8e88
    
      FAILED: : && /tmp/clang-build/build/./bin/clang++
      CMakeFiles/cmTC_d8e88.dir/testCXXCompiler.cxx.o -o cmTC_d8e88 && :
    
      /usr/bin/ld: cannot find -lc++
    
      clang-6.0: error: linker command failed with exit code 1 (use -v to see
      invocation)
    
      ninja: build stopped: subcommand failed.
    
    
    
    
    
      CMake will not be able to correctly generate this project.
    Call Stack (most recent call first):
      CMakeLists.txt:45 (project)
    [...]
    

    单个阶段的构建似乎已成功完成:

    $ git clone https://github.com/llvm-mirror/llvm.git
    $ cd llvm
    $ git checkout release_60
    $ utils/docker/build_docker_image.sh -s debian8 \
        -d "clang-1stage" -t "6" --branch branches/release_60 \
        -p compiler-rt -p libcxxabi -p libcxx -p clang \
        -i install-compiler-rt \
        -i install-libcxxabi \
        -i install-libcxx \
        -i install-clang \
        -i install-clang-headers -- \
        -DCMAKE_BUILD_TYPE=Release \
        -DCLANG_DEFAULT_CXX_STDLIB=libc++ \
        -DCLANG_DEFAULT_RTLIB=compiler-rt
    

    但当我运行容器时,链接也有问题:

    $ docker run -it clang:6
    root@1e95a7ffe57a:/# echo "#include <iostream>" > main.cpp
    root@1e95a7ffe57a:/# echo "int main(){ std::cout << \"Hello World\\n\"; }" >> main.cpp
    root@1e95a7ffe57a:/# clang++ main.cpp 
    /usr/bin/ld: /tmp/main-7d03e7.o: undefined reference to symbol '_Unwind_Resume@@GCC_3.0'
    //lib/x86_64-linux-gnu/libgcc_s.so.1: error adding symbols: DSO missing from command line
    clang-6.0: error: linker command failed with exit code 1 (use -v to see invocation)
    

    我做错什么了?

    1 回复  |  直到 6 年前
        1
  •  1
  •   valiano    6 年前

    你错过了另一个LLVM项目, libunwind .

    LLVM的libund提供了一个轻量级的堆栈展开接口,并且与libcxx和libcxxabi紧密耦合。

    你应该在 projects 文件夹,它应该由LLVM自动选择。您可能还需要添加 -DLIBCXXABI_USE_LLVM_UNWINDER=YES 到CMake命令行。

    有用链接: Clang 8 documentation - Assembling a Complete Toolchain .