LLVM初體驗——LLVM,Clang和libc++的編譯和安裝


一直想試試這個LLVM的,據說錯誤提示信息比GCC好,C++11支持的也更多。今天編譯的時候,發現用了幾個C++11特性了,gcc4.4沒法編譯,於是想,那就嘗試一下LLVM吧。

既然是想安裝比較新的版本的LLVM,新立得軟件包上的肯定不是好的選擇。想用預編譯好的.deb包,卻發現不支持ubuntu10.04,好像11.10之后的是可以用deb包的。那就源代碼編譯吧,這應該總是可以的。

目的,LLVM和Clang,編譯C/C++,
環境Ubuntu10.04,X86,gcc4.4.

先搞清楚要准備哪些東西,在http://llvm.org/docs/GettingStarted.html#getting-started-with-llvm上,講的還是比較清除的,軟件依賴環境用configure檢查吧。
先下載需要的源代碼,
(a)LLVM的源代碼,
在某個文件夾temp下,
svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm
下載完成之后,就可以看到temp下面有個llvm的文件夾。
(b)Clang的源代碼
先切換以下文件夾,
cd llvm/tools
svn co http://llvm.org/svn/llvm-project/cfe/trunk clang
(c)extra Clang tools,這個是可選的,
同樣,需要先切換文件夾,注意切換的時候,都是以temp為當前目錄的。
cd llvm/tools/clang/tools
svn co http://llvm.org/svn/llvm-project/clang-tools-extra/trunk extra
(d)最后一個源代碼,Compiler-RT
cd llvm/projects
svn co http://llvm.org/svn/llvm-project/compiler-rt/trunk compiler-rt

接下來就要開始編譯了,
現在temp下建立一個build文件夾,存放編譯生成的東西。
然后進入build文件夾,生成配置文件。
cd build
../llvm/configure [option]
那么就可以看到開始檢查依賴環境,如果沒有問題,就會生成makefile了。
這里在configure的時候,可以添加一些選項。
在Local LLVM Configuration部分(http://llvm.org/docs/GettingStarted.html#local-llvm-configuration),可以看到支持的選項,
這里我使用了--enable-optimized(打開優化,svn得到的默認值是不打開的,會生成debug的相關內容,覺得沒有必要,而且會占用較大的空間,就不要了)
另一個選項,--enable-targets=target-option,這個很重要,選擇目標平台的,一般情況下使用host-only就可以了,只需要適合本機的情況就可以了,
默認情況下會生成所有平台的,沒有必要。
還有一個是assert的選項,--enable-assertions,這個需要嗎?不太清楚,默認是打開的,可以使用--disable-assertions關閉,我猜是這樣,好像沒有看到說怎么關閉這個。其它選項就沒關注了。

還有想找的一個配置選項是,只針對C/C++,包括Python也可以,不需要對所有語言,文檔里有說可以這樣做,但就是沒找到怎樣做。

生成makefile之后,就開始make了。make可以指定多線程同時工作,例如make -j2,沒有這樣使用,其它的make clean, make dist-clean也可以使用。(編譯了好長時間,早知道就用-j2了,就兩核,-j4估計不會有很大的改變)

最后一步,就是make install了。默認情況下會安裝到/usr/local/下面。

這樣,clang應該是安裝好了,接下來要做的事情的,安裝libc++。這個是為C++11實現的標准庫,既然是為了C++11才安裝的LLVM,那么這個肯定也是要安裝的了。

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

http://clang.llvm.org/cxx_status.html上面有一句話,Clang可以以兩種方式使用C++11,一種是使用libc++,另一種是是使用libstdc++,這個是GCC使用的標准庫,但是在libstdc++4.4,4.6,4.7上,需要打補丁,Clang才能使用。既然這樣的話,肯定是直接使用libc++了。

安裝方法,在http://www.cnblogs.com/ralphjzhang/archive/2011/12/02/2272671.html這里說了一些,但是測試的時候還是出現了一些問題,下面是具體的過程,測試通過。

在上面提到的temp目錄下,仍然是使用svn下載源代碼,
svn co http://llvm.org/svn/llvm-project/libcxx/trunk libcxx
然后,
cd libcxx/lib
./buildit
那么在lib下面就生成了需要的動態庫文件, libc++.so.1.0。到這里,那篇博文里面的都還對,后面的其實也對,不過建立鏈接的時候有些問題。
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
區別在於,ln -sf 源文件 目標鏈接,而且使用的是絕對路徑,這樣,在/usr/lib/下面會有三個文件。
為什么要有這三個文件呢?在編譯鏈接的時候,-lc++或者stdlib=libc++,都會去鏈接libc++.so這個,而在運行的時候,會需要libc++.so.1這個。不知道為什么會這樣,但是如果不是這樣的話,編譯和運行的時候就會出錯。借用博文里面的例子,測試通過。

下面是在StackOverflow上看到的使用方法,http://stackoverflow.com/questions/10601545/clang-3-1-and-c11-support-status
# uses clang's C++ library in C++98 mode
clang++ -stdlib=libc++ [input] # uses clang's C++ library


# uses clang's C++ library and enables C++11 mode
clang++ -stdlib=libc++ -std=c++11 [input]
clang++ -stdlib=libc++ -std=c++0x [input]

可以用了,先就這樣。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM