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

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

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

LLVM3.3提供了很是豐富的Pre-built Binaries:包括Ubuntu13.04,Ubuntu12.04和Ubuntu10.04,還有Debian六、FreeBSD9和Fedora18,固然還有Apple本身的Mac OS X了。只惋惜沒有給CentOS也提供預編譯版本,只能本身編譯安裝了。c++

今天在CentOS上將最新版本的LLVM套件(LLVM,Clang和Libc++)編譯安裝好了,中間遇到了很多問題。雖然已經有不少博客介紹如何編譯安裝LLVM了,可是根據我本身親身體驗的狀況來看,仍是有地方須要注意的,也有東西值得跟你們分享一下。shell

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

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

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

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

下面開始:code

首先,從http://llvm.org/releases/download.html#3.3這邊下載最新的版本。若是從SVN下載代碼的話,已是3.4的開發版本了,若是須要使用穩定版本,推薦本身下載3.3的代碼包,須要下載5個文件:htm

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!

相關文章
相關標籤/搜索