CentOS 6.4 編譯安裝LLVM3.3,Clang和Libc++

tangzhnju發表於2013-06-18

LLVM的最新版本3.3終於在6月17日釋出了,按之前的計劃6月5日就應該釋出了,不過畢竟沒有太晚,趕在VS2013 preview(6月26日微軟Build大會)之前出來了微笑。加上之前gcc4.8.1在5月底6月初發布,當今最優秀的三大C++編譯器都在這個月釋出重要更新,這個6月份真是C++的好日子啊!

LLVM之前就已經宣佈做到C++11 Feature Complete了,3.3應該是第一個穩定版,之前gcc4.8.1也同樣是全面支援C++11,這篇文章介紹瞭如何在CentOS上編譯安裝最新的gcc,VS一直是落後很多的,不過還是很期待VS2013 preview中能增加多少C++11特性。

LLVM3.3提供了非常豐富的Pre-built Binaries:包括Ubuntu13.04,Ubuntu12.04和Ubuntu10.04,還有Debian6、FreeBSD9和Fedora18,當然還有Apple自己的Mac OS X了。只可惜沒有給CentOS也提供預編譯版本,只能自己編譯安裝了。

今天在CentOS上將最新版本的LLVM套件(LLVM,Clang和Libc++)編譯安裝好了,中間遇到了不少問題。雖然已經有很多部落格介紹如何編譯安裝LLVM了,但是根據我自己親身體驗的情況來看,還是有地方需要注意的,也有東西值得跟大家分享一下。

安裝過程主要參考這幾篇文章:

http://clang.llvm.org/get_started.html

http://www.cnblogs.com/Frandy/archive/2012/10/20/llvm_clang_libcxx_cxx11.html

http://www.cnblogs.com/ralphjzhang/archive/2011/12/02/2272671.html

下面開始:

首先,從http://llvm.org/releases/download.html#3.3這邊下載最新的版本。如果從SVN下載程式碼的話,已經是3.4的開發版本了,如果需要使用穩定版本,推薦自己下載3.3的程式碼包,需要下載5個檔案:

LLVM source code

Clang source code

Clang Tools Extra source code

Compiler RT source code

LibC++ source code

下載好了以後,四個壓縮包都解壓出來,得到四個目錄:

llvm-3.3.src

cfe-3.3.src

clang-tools-extra-3.3.src

compiler-rt-3.3.src

libcxx-3.3.src

然後按下面的步驟組織:

mv cfe-3.3.src clang
mv clang/ llvm-3.3.src/tools/

mv clang-tools-extra-3.3.src extra
mv extra/ llvm-3.3.src/tools/clang/

mv compiler-rt-3.3.src compiler-rt
mv compiler-rt llvm-3.3.src/projects/

這樣以後clang,clang-tools-extra和compiler-rt就可以和llvm一起編譯了。

在llvm-3.3.src同一層目錄上新建個目錄build-3.3並進入:

mkdir build-3.3
cd build-3.3

然後configure:

../llvm-3.3.src/configure --enable-optimized --enable-targets=host-only

注意這邊兩個選項推薦大家加上,否則會產生巨大的檔案,我第一次編譯的時候,沒有加上這兩個選項,編譯出來的結果多大9.4G(夠嚇人的吧?把我的磁碟都耗盡了,還報錯,google了好久才發現是磁碟空間不夠),耗時超過一個半小時,加上以後編譯出來的結果不到1G,i5四核20分鐘多一點就編譯完成。

然後make:

make -j4

儘量把幾個核都用上。

然後make install:

sudo make install

用clang++ -v檢視下:

clang version 3.3 (tags/RELEASE_33/final)
Target: x86_64-unknown-linux-gnu
Thread model: posix

此時clang就可以正常使用了,clang預設用的是C++庫gcc的libstdc++。clang用法和gcc類似,如果要使用C++11的話:

clang++ -std=c++11 [input]

如果想用LLVM自己的libc++,就需要以下步驟(有點小麻煩)

進入之前解壓出來的libcxx-3.3.src:

cd libcxx-3.3.src/lib
./buildit

然後在libcxx-3.3.src/lib下面就可以看到libc++.so.1.0檔案,這就是libc++的動態庫。

按照下面的步驟把libc++.so.1.0放到/usr/lib下,並建立幾個連結:

sudo cp ./libc++.so.1.0 /usr/lib
cd /usr/lib
sudo ln -sf /usr/lib/libc++.so.1.0 libc++.so
sudo ln -sf /usr/lib/libc++.so.1.0 libc++.so.1

然後把libcxx-3.3.src/include目錄拷貝到/usr/include/c++/v1(這個地址是clang預設查詢的目錄,如果目錄不存在則自己建立):

cp -r libcxx-3.3.src/include/ /usr/include/c++/v1

按理說,這樣以後,就可以了,使用libc++的方式如下:

clang++ -stdlib=libc++ -std=c++11 [input]

但是我這邊編譯的時候,提示找不到標頭檔案,需要手動加上-I/usr/include/c++/v1/:

clang++ -stdlib=libc++ -std=c++11 -I/usr/include/c++/v1/ [input]

執行的時候,也會提示連結錯誤:error while loading shared libraries: libc++.so.1: cannot open shared object file: No such file or directory。

解決辦法是在~/.basrch中加入下面的環境變數:

export LD_LIBRARY_PATH=/usr/lib:/usr/local/lib

重啟個shell就可以了正常執行了,上面這些找不到標頭檔案和連結錯誤都是因為使用libc++的原因,如果使用預設的libstdc++就沒有這些問題

OK,儘管使用起來有點小麻煩,不過寫個makefile就不用每次都敲那麼長的命令了,Enjoy!

相關文章