【问题标题】:How to Build libcxx and libcxxabi by clang on CentOS 7如何在 CentOS 7 上通过 clang 构建 libcxx 和 libcxxabi
【发布时间】:2014-11-08 12:14:17
【问题描述】:

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

【问题讨论】:

  • 如果您不想构建任何东西,您可以使用 C++11 (without <regex>) 和 Clang 3.4.2 以及 CentOS 7 上预装的 libstdc++。启用 EPEL存储库和yum install clang 获取Clang 3.4.2
  • 请参阅this answer,了解如何使用 SCL 存储库在 CentOS 7 上安装最新的 Clang。

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


【解决方案1】:

本文讲授如何在 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++ 的 libc++abi。最后,通过libc++abi,我们可以构建一个新的libc++链接libc++abi。

clang、libc++、libc++abi环境搭建步骤如下:

  1. 添加 RHEL 的 EPEL 存储库。 打开以下链接并找到“如何使用这些额外的软件包?”部分 https://fedoraproject.org/wiki/EPEL
    找到你的 CentOS 版本的 epel 包。例如:

    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
    

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

【讨论】:

  • 这真的很有帮助,我希望你能更深入地解释为什么这些步骤是必要的。
  • 抱歉,我不是专业人士,无法准确解释一切。但是,这些步骤只适用于 CentOS 7。我会尽量添加一些 cmets。
  • @StevenLu:Centos 7 基于 Fedora 19。因此,相同步骤的工作机会很小。这是预期的行为。
  • libcxx-3.8.0-3.el7.x86_64 可通过epel 获取,一个可以yum install libcxx
猜你喜欢
  • 1970-01-01
  • 2017-10-28
  • 2022-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多