※ [本文轉錄自 Linux 看板 #1J__eXfd ]
作者: zxvc (眾生都是未來佛) 看板: Linux
標題: [分享] 在CentOS 7建置Clang編譯環境
時間: Fri Aug 29 11:57:14 2014
以下文章將教你如何在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
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=clang -DCMAKE_CXX_COMPILER=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/lib
# 因為epel的clang没有llvm-config,所以我們不用cmake來建造libcxxabi,
# 而使用傳統的buildit。
./buildit
sudo cp libc++abi.so.1.0 /usr/lib
sudo ln -s /usr/lib/libc++abi.so.1.0 /usr/lib/libc++abi.so.1
sudo ln -s /usr/lib/libc++abi.so.1.0 /usr/lib/libc++abi.so
cd ../..
7. 第二輪建造libcxx(使用libcxxabi)
cd libcxx
mkdir tmp
cd tmp
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr \
-DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=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/