Как собрать libcxx и libcxxabi с помощью clang на CentOS 7

Я хочу использовать C++11 или C++14 с clang/clang++ в CentOS 7. Как мне построить эту среду сборки?

1 ответ

Решение

В этой статье рассказывается, как создать среду сборки C++11 на CentOS 7: репозиторий RELEL EPEL предоставляет пакеты Clang, но не пакеты библиотек C++. Таким образом, эти части немного хлопотно для сборки вручную. Настраиваемые библиотеки C++ для Clang - это libC++ (libcxx) [1]. Затем libcxx также нужна библиотека ABI, libC++abi (libcxxabi) [2]. К сожалению, эти две библиотеки имеют проблему циклической зависимости. Для решения проблемы циклических зависимостей libC++ может быть собран без привязки к libC++ abi. Затем, используя этот libC++, мы можем создать libC++ abi, связывающий libC++. Наконец, с помощью libC++ abi мы можем создать новый libC++, связывающий libC++ abi.

Этапы построения среды clang, libC++ и libC++ abi приведены ниже:

  1. Добавьте репо RHEL в EPEL. Откройте следующую ссылку и найдите раздел "Как я могу использовать эти дополнительные пакеты?" https://fedoraproject.org/wiki/EPEL
    Найдите пакет epel для вашей версии CentOS. Например,:

    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. 1-й тур, чтобы построить libcxx без 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. Сборка libcxxabi с помощью 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. 2-й тур, чтобы построить libcxx с 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. Написать тестовую программу на C++.

    // t.cpp
    #include <iostream>
    using namespace std;
    int main() {
      cout << "Hello world!" << endl;
    }
    
  9. Проверьте компиляцию C++ 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/

Другие вопросы по тегам