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-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!