[分享] 在CentOS 7建置Clang编译环境

楼主: zxvc (众生都是未来佛)   2014-08-29 11:57:14
以下文章将教你如何在CentOS 7上建置可建置(build)C++11程式的环境。
Clang是一套Linux/UNIX上支援C++11很完整的编译器,是Apple开发出来的。
RHEL的EPEL repo有提供Clang的package,但没有C++ libraries的package,
所以这个部分较麻烦,要自己抓源始码建。
Apple有提供Clang专用的C++ libraries - libc++ (libcxx)[1]。
libcxx又要使用一种ABI的东西(我不是很懂),
Apple也有提供,叫libc++abi (libcxxabi)[2]。
但这两个libs正常来讲有循环相依的问题。
要打破循环相依,libc++支援在建置时不必连结libc++abi。
这样我们就能先建一个没连结libc++abi的libc++。
接着就可以建libc++abi。再来有了libc++abi,
就能建一个连结libc++abi的libc++。
Clang & libc++ & libc++abi环境建置步骤如下:
1. 加入RHEL的EPEL repo。
去以下连结的"How can I use these extra packages?"
找CentOS对应版本的epel package安装。
https://fedoraproject.org/wiki/EPEL
例如:
sudo rpm -i \
http://ftp.jaist.ac.jp/pub/Linux/Fedora/epel/7/x86_64/\
epel-release-7-0.2.noarch.rpm
2. 安装Subversion,以取得libcxx与libcxxabi。
sudo yum install svn
3. 安装Clang。
sudo yum install clang llvm-devel
4. 安装cmake。
cd /usr/local
wget http://www.cmake.org/files/v3.0/cmake-3.0.1-Linux-i386.sh
sudo ./cmake-3.0.1-Linux-i386.sh
# 确认cmake有没有装到/usr/local/bin。
5. 第一轮建造libcxx(不使用libcxxabi).
# Get libcxx.
svn co http://llvm.org/svn/llvm-project/libcxx/trunk libcxx
cd libcxx
mkdir tmp
cd tmp
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr \
-DCMAKE_C_COMPILER=/usr/bin/clang \
-DCMAKE_CXX_COMPILER=/usr/bin/clang++ ..
sudo make install
sudo ln -s /usr/lib/libc++.so.1 /lib64
cd ..
rm tmp -rf
cd ..
6. 建造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 \
-DLIBCXXABI_LIBCXX_INCLUDES=../../libcxx/include \
-DCMAKE_C_COMPILER=/usr/bin/clang -DCMAKE_CXX_COMPILER=/usr/bin/clang++ \
-DCMAKE_CXX_FLAGS="-std=c++11" -DCMAKE_INSTALL_PREFIX=/usr ..
sudo make install
cd ../..
7. 第二轮建造libcxx(使用libcxxabi)
cd libcxx
mkdir tmp
cd tmp
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr \
-DCMAKE_C_COMPILER=/usr/bin/clang \
-DCMAKE_CXX_COMPILER=/usr/bin/clang++ \
-DLIBCXX_CXX_ABI=libcxxabi \
-DLIBCXX_LIBCXXABI_INCLUDE_PATHS=../../libcxxabi/include ..
sudo make install
8. 用Clang测试建置。
vim t.cpp
~~~~~~~~~~~~~~~~~~~~~~~~~~~
#include <iostream>
using namespace std;
int main() {
cout << "Hello world!" << endl;
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~
clang++ -std=c++11 -stdlib=libc++ -lc++abi t.cpp
./a.out
后记:
1. 以上步骤应该跟CentOS 6上差不多,我曾经在6上也建成功,
只是印象要改一点东西...大家自己试试。
记得CentOS 5不幸没有已编好的Clang package。
2. 以上步骤有很多ln -s连来连去,但很多是必要的。因为Clang跟LD很笨(!?),
例如:有的tool只去抓libc++abi.so,有的人只去抓/lib64/libc++.so.1。
这部分可能不同OS又不同,要自己判断一下。
3. Clang也支援GCC的libsupc++,但我在CentOS没build成功过。建议用libc++。
References:
[1] http://libcxx.llvm.org/
[2] http://libcxxabi.llvm.org/
作者: licheng (阿正)   2014-08-30 11:25:00
还不想碰 Clang,不过还是给你赞一个 :)
楼主: zxvc (众生都是未来佛)   2014-08-30 21:48:00
我是因为在用C++11,才改用Clang。Clang连许多C++14的东西都做出来了。
作者: carylorrk (carylorrk)   2014-08-31 16:37:00
其实 gcc 4.9 也是啊XD!不过 clang 可以做很多有趣的应用~模组化设计棒!
楼主: zxvc (众生都是未来佛)   2014-08-31 18:36:00
但CentOS 6.5的gcc是4.4.7,要自己从source code建4.9是个不小工程。虽然说CentOS 6.5是刚好有Clang packages,要建C++11环境才比较方便。我想本文较大的价值在因为不少人在用CentOS,7又才刚出,大家可能还在6.5,又想用C++11。另外CentOS 7的gcc是4.8.2,C++11已支援满完整了,但C++14..所以同样道理,在CentOS 6.5/7想用C++14,Clang会方便一点。抱歉,CentOS 6.5的Clang是3.2。要用C++14,要3.4。CentOS 7就是Clang 3.4。http://clang.llvm.org/cxx_status.html刚才用yum update发现CentOS 6.5也有Clang 3.4.2了:D

Links booklink

Contact Us: admin [ a t ] ucptt.com