Men*_*ang 23
本文教授如何在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 ++ abi链接libc ++.最后,使用libc ++ abi,我们可以构建一个新的libc ++链接libc ++ abi.
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
Run Code Online (Sandbox Code Playgroud)安装Subversion以获取最新的libcxx和libcxxabi.
sudo yum install svn
Run Code Online (Sandbox Code Playgroud)安装Clang和llvm-devel(使用llvm-config).
sudo yum install clang llvm-devel
Run Code Online (Sandbox Code Playgroud)安装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.
Run Code Online (Sandbox Code Playgroud)第一轮没有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 ..
Run Code Online (Sandbox Code Playgroud)使用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 ../..
Run Code Online (Sandbox Code Playgroud)第二轮用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
Run Code Online (Sandbox Code Playgroud)编写C++测试程序.
// t.cpp
#include <iostream>
using namespace std;
int main() {
cout << "Hello world!" << endl;
}
Run Code Online (Sandbox Code Playgroud)通过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
Run Code Online (Sandbox Code Playgroud)参考文献:
[1] http://libcxx.llvm.org/
[2] http://libcxxabi.llvm.org/
| 归档时间: |
|
| 查看次数: |
12195 次 |
| 最近记录: |