在CentOS 7建置Clang編譯環境 - Linux

Enid avatar
By Enid
at 2014-08-29T11:57

Table of Contents

以下文章將教你如何在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/

--
楞嚴咒(附注音):
http://sdrv.ms/130iapv

--
Tags: Linux

All Comments

Isla avatar
By Isla
at 2014-08-31T08:46
還不想碰 Clang,不過還是給你讚一個 :)
Ivy avatar
By Ivy
at 2014-09-02T12:07
我是因為在用C++11,才改用Clang。Clang連許多C++14的東西都
Mia avatar
By Mia
at 2014-09-04T20:16
做出來了。
Rachel avatar
By Rachel
at 2014-09-06T10:48
其實 gcc 4.9 也是啊XD!不過 clang 可以做很多有趣的
應用~模組化設計棒!
Thomas avatar
By Thomas
at 2014-09-10T18:53
但CentOS 6.5的gcc是4.4.7,要自己從source code建4.9是個不
小工程。
Rae avatar
By Rae
at 2014-09-11T00:54
雖然說CentOS 6.5是剛好有Clang packages,要建C++11環境才
Zora avatar
By Zora
at 2014-09-14T17:18
比較方便。我想本文較大的價值在因為不少人在用CentOS,7又
Enid avatar
By Enid
at 2014-09-18T11:21
才剛出,大家可能還在6.5,又想用C++11。
Zenobia avatar
By Zenobia
at 2014-09-22T19:31
另外CentOS 7的gcc是4.8.2,C++11已支援滿完整了,但C++14..
Audriana avatar
By Audriana
at 2014-09-26T05:00
所以同樣道理,在CentOS 6.5/7想用C++14,Clang會方便一點。
George avatar
By George
at 2014-09-30T16:55
抱歉,CentOS 6.5的Clang是3.2。要用C++14,要3.4。CentOS 7
就是Clang 3.4。
http://clang.llvm.org/cxx_status.html
Victoria avatar
By Victoria
at 2014-10-03T19:34
剛才用yum update發現CentOS 6.5也有Clang 3.4.2了:D
David avatar
By David
at 2014-10-08T02:19
更新libcxxabi的建置指令。

mint瀏覽器連mega下載

Callum avatar
By Callum
at 2014-08-29T02:29
裝了linux mint 17 非常奇怪的事情發生了 不知道為什麼無法使用瀏覽器連 mega空間進行下載 firefox是完全沒進度顯示 qupzilla是顯示到99%停住 搞的心情有點差 想問一下各位大大是否有解法?這實在太困擾了 - ...

多系統硬碟存取問題

Erin avatar
By Erin
at 2014-08-28T21:16
小弟想請問一下 ubuntu Grub可以建立以下環境嗎 環境架構是 1.XP 2.WIN7 3.WIN8 4.Linux ubuntu XP與WIN8除了系統槽外可以共用D槽 WIN7則是根本看不到XP與WIN8共用的D槽 謝謝 - ...

請教CentOS 6.3 版VMM的問題

Eartha avatar
By Eartha
at 2014-08-28T20:35
請教一個問題!我是linux的新手 最近因為有需求需要在centOS 6.3上面架構一個win7 那我用的方法是系統內附的Virtual Machine Manager 結果是可以把win7 開起來 但是卻發現這個win7無法跟外界溝通 就是我無法把我要灌在win7上的資料餵進去 ...

怎麼單純的port轉送

Joseph avatar
By Joseph
at 2014-08-28T16:39
因為有些原因 只能選其他port來連線ssh server 我試著改ssh server預設的port 可是這樣好像會影響防火牆之類的 我在想有沒有簡單的方法在server上設定port轉傳 比如說port11111就傳到ssh的22這樣 不知道有沒有簡單的作法可以做到 謝謝囉 - ...

lenovo x240 wireless

David avatar
By David
at 2014-08-27T15:00
你好 我新買一台電腦 我的電腦是lenovo x240 可是他的wifi不通 我該怎麼設定或安裝? $ uname -a Linux laptop 3.2.0-4-amd64 #1 SMP Debian 3.2.60-1+deb7u3 x86_64 GNU/Linux $ sudo lspci -vq ...