如何在CentOS 7上使用clang构建libcxx和libcxxabi

21

我想在CentOS 7上使用clang/clang++编译器来使用C++11或C++14。我该如何构建这个开发环境?


如果您不想构建任何东西,可以使用C++11(不带<regex>)与Clang 3.4.2和预安装的libstdc++在CentOS 7上。启用EPEL存储库并yum install clang以获取Clang 3.4.2 - phoenix
请参考此答案,了解如何使用SCL存储库在CentOS 7上安装最新的Clang。 - phoenix
1个回答

28
本文介绍如何在CentOS 7上构建C++11构建环境:RHEL的EPEL仓库提供了Clang软件包,但没有C++库软件包。因此,这些部分需要手动构建,有点麻烦。针对Clang的定制C++库是libc++(libcxx)[1]。然后,libcxx还需要一个ABI库,libc++abi(libcxxabi)[2]。不幸的是,这两个库存在循环依赖问题。为了打破循环依赖问题,可以在不链接libc++abi的情况下构建libc++。然后,使用这个libc++,我们可以构建链接libc++的libc++abi。最后,使用libc++abi,我们可以构建链接libc++abi的新libc++。
以下是构建clang、libc++和libc++abi环境的步骤:
  1. Add RHEL's EPEL repo. Open the following link and find the section "How can I use these extra packages?" https://fedoraproject.org/wiki/EPEL
    Find the epel package for your CentOS version. E.g.,:

    sudo rpm -i https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
    
  2. Install Subversion for getting the latest libcxx and libcxxabi.

    sudo yum install svn
    
  3. Install Clang and llvm-devel (with llvm-config).

    sudo yum install clang llvm-devel
    
  4. Install 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. 1st round to build libcxx without libcxxabi.

    # 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. Build libcxxabi with libc++.

    # 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. 2nd round to build libcxx with libcxxabi.

    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. Write a C++ test program.

    // t.cpp
    #include <iostream>
    using namespace std;
    int main() {
      cout << "Hello world!" << endl;
    }
    
  9. Test C++ compilation by clang++.

    # -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
    

参考文献:
[1] http://libcxx.llvm.org/
[2] http://libcxxabi.llvm.org/

这段内容是关于IT技术方面的参考文献,其中包括两个链接,分别是http://libcxx.llvm.org/和http://libcxxabi.llvm.org/。请注意保留HTML标签。

这真的很有帮助,我希望您能分享更深入的解释,为什么这些步骤是必要的。 - Steven Lu
1
抱歉,我不是专业人士,无法准确地解释所有内容。但是,这些步骤仅适用于CentOS 7。我会尽可能添加一些注释。 - Meng-Yuan Huang
1
@StevenLu:Centos 7是基于Fedora 19的。因此,同样的步骤成功的可能性很小。这是预期的行为。 - Sardathrion - against SE abuse
libcxx-3.8.0-3.el7.x86_64 is available through epel, one can yum install libcxx - alexus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接