如何在CentOS 7上通过clang构建libcxx和libcxxabi

时间:2014-09-15 02:32:26

标签: c++ c++11 centos clang libc++

我想在CentOS 7上使用带有clang / clang ++的C ++ 11或C ++ 14.如何构建这个构建环境?

1 个答案:

答案 0 :(得分:23)

本文讲述了如何在CentOS 7上构建C ++ 11构建环境:RHEL的EPEL repo提供了Clang软件包,但没有提供C ++库软件包。因此,这些部件手工制作有点麻烦。 Clang的自定义C ++库是libc ++(libcxx)[1]。然后,libcxx还需要一个ABI库libc ++ abi(libcxxabi)[2]。不幸的是,这两个库存在循环依赖问题。为了打破循环依赖问题,可以在不链接libc ++ abi的情况下构建libc ++。然后,使用这个libc ++,我们可以构建libc ++ abi链接libc ++。最后,使用libc ++ abi,​​我们可以构建一个新的libc ++链接libc ++ abi。

clang,libc ++和libc ++ abi环境构建步骤如下:

  1. 添加RHEL的EPEL回购。 打开以下链接,找到"我如何使用这些额外的包?" https://fedoraproject.org/wiki/EPEL
    找到CentOS版本的epel包。 。E.g,:

    sudo rpm -i https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
    
  2. 安装Subversion以获取最新的libcxx和libcxxabi。

    sudo yum install svn
    
  3. 安装Clang和llvm-devel(使用llvm-config)。

    sudo yum install clang llvm-devel
    
  4. 安装cmake。

    cd /usr/local
    wget https://cmake.org/files/v3.5/cmake-3.5.2-Linux-i386.sh
    sudo chmod 755 cmake-3.5.2-Linux-i386.sh
    sudo ./cmake-3.5.2-Linux-i386.sh
    # Check cmake is in /usr/local/bin.
    
  5. 第一轮构建没有libcxxabi的libcxx。

    # Get libcxx.
    svn co http://llvm.org/svn/llvm-project/libcxx/trunk libcxx
    cd libcxx
    # It is not recommended to build libcxx in the source root directory.
    # So, we make a tmp directory.
    mkdir tmp
    cd tmp
    # Specifying CMAKE_BUILD_TYPE to Release shall generate performance optimized code.
    # The CMAKE_INSTALL_PREFIX changes the install path from the default /usr/local to /usr.
    cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ ..
    sudo make install
    cd ..
    rm tmp -rf
    cd ..
    
  6. 使用libc ++构建libcxxabi。

    # Get libcxxabi.
    svn co http://llvm.org/svn/llvm-project/libcxxabi/trunk libcxxabi
    cd libcxxabi
    mkdir tmp
    cd tmp
    cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DLIBCXXABI_LIBCXX_INCLUDES=../../libcxx/include ..
    sudo make install
    cd ../..
    
  7. 第二轮用libcxxabi构建libcxx。

    cd libcxx
    mkdir tmp
    cd tmp
    # This time, we want to compile libcxx with libcxxabi, so we have to specify LIBCXX_CXX_ABI=libcxxabi and the path to libcxxabi headers, LIBCXX_LIBCXXABI_INCLUDE_PATHS.
    cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DLIBCXX_CXX_ABI=libcxxabi -DLIBCXX_CXX_ABI_INCLUDE_PATHS=../../libcxxabi/include ..
    sudo make install
    
  8. 编写C ++测试程序。

    // t.cpp
    #include <iostream>
    using namespace std;
    int main() {
      cout << "Hello world!" << endl;
    }
    
  9. 通过clang ++测试C ++编译。

    # -std specifies the C++ standard. -stdlib specifies the C++ library you want to use with clang/clang++. -lc++abi is necessary, because the new LD (linker and loader) on CentOS 7 doesn't allow indirect library linking.
    clang++ -std=c++11 -stdlib=libc++ -lc++abi t.cpp
    ./a.out
    
  10. 参考文献:
    [1] http://libcxx.llvm.org/
    [2] http://libcxxabi.llvm.org/