如何在CentOS 7上通过clang构建libcxx和libcxxabi
How to Build libcxx and libcxxabi by clang on CentOS 7
我想在CentOS 7上使用带有clang/crang++的C++11或C++14。如何构建这种建筑环境?
本文介绍如何在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++abi的libc++。
clang、libc++和libc++abi环境构建步骤如下所示:
-
添加RHEL的EPEL回购。打开以下链接,找到"如何使用这些额外的软件包?"https://fedoraproject.org/wiki/EPEL
查找适用于您的CentOS版本的epel软件包。例如: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.
-
第一轮在没有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 ..
-
使用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 ../..
-
第二轮使用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
-
编写一个C++测试程序。
// t.cpp #include <iostream> using namespace std; int main() { cout << "Hello world!" << endl; }
-
通过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/
- 与clang++一起使用的VS代码在构建良好的C++文件中显示错误
- 如何构建默认使用我自己的构建libc ++的clang?
- MFC/DLL中缺少ATL :: CSTRINGT功能,该功能与Clang/vs-2019构建
- 与OpenMP相关的错误,以及使用OpenMP构建LLVM / Clang时C++
- 如何在不同的命名空间中使用双重声明的 extern "C"函数进行 clang 构建(如 msvc 和 gcc)
- 如何在 32 位 Ubuntu 18.04 上使用 64 位 clang v8 构建 libc++
- 将 CLANG 构建的可执行文件与 G++-v6 构建的 Boost 库链接时出错
- Libace相关的clang构建错误`提供的参数很少为功能型宏调用`
- 使用CMAKE,NINJA和CLANG构建项目,以竞争2019年
- 我无法获得由 Clang 构建的优化 NDK 应用程序的调用堆栈
- 可以与CMAKE-BUILD一起使用Clang静态分析仪(扫描构建)
- 当我用CMake和ninja构建时,clang++忽略了-MD标志
- 如何使用Android构建的CMAKE GERTATOR-EXPEXPRYS生成Clang编译器标志
- 在Windows 10上使用MINGW构建的Clang的调试构建无法运行
- 使用Clang的UB消毒剂构建的程序的附加输出
- 使用 Clang 的扫描构建与 scons 和 C++11
- 使用Google测试,CLANG和LIBC 进行故障构建测试
- Clang 不会在Boost Signals2中构建第一个示例2
- RIOS X Mavericks上使用clang++构建的内部示例在链接上找不到STL标准库
- 使用Clang构建C++静态库时的奇怪行为