Я хочу использовать С++ 11 или С++ 14 с clang/clang++ в CentOS 7. Как мне построить эту среду здания?
Как создать libcxx и libcxxabi, clang на CentOS 7
Ответ 1
В этой статье рассказывается о том, как построить среду разработки С++ 11 на CentOS 7: RHEL EPEL repo предоставляет пакеты Clang, но не пакеты библиотеки С++. Таким образом, эти части немного хлопотливы, чтобы их можно было создать вручную. Индивидуальные библиотеки С++ для Clang - libС++ (libcxx) [1]. Затем libcxx также нуждается в библиотеке ABI, libС++ abi (libcxxabi) [2]. К сожалению, эти две библиотеки имеют проблему с круговой зависимостью. Для устранения проблемы с круговой зависимостью libС++ можно построить без привязки libС++ abi. Затем, с помощью этого libС++, мы можем построить libС++ abi, связывающий libС++. Наконец, с libС++ abi, мы можем построить новый libС++, связывающий libС++ abi.
Шаги по созданию среды clang, libС++ и libС++ abi приведены ниже:
-
Добавить репозиторий RHEL EPEL. Откройте следующую ссылку и найдите раздел "Как я могу использовать эти дополнительные пакеты?" https://fedoraproject.org/wiki/EPEL
Найдите пакет epel для вашей версии CentOS.. Например,sudo rpm -i https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
-
Установите Subversion для получения последних libcxx и libcxxabi.
sudo yum install svn
-
Установите Clang и llvm-devel (с llvm-config).
sudo yum install clang llvm-devel
-
Установите 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.
-
Первый раунд для создания 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 ..
-
Создайте libcxxabi с помощью libС++.
# 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 ../..
-
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
-
Напишите тестовую программу С++.
// t.cpp #include <iostream> using namespace std; int main() { cout << "Hello world!" << endl; }
-
Тестовая компиляция С++ с помощью 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/