1. 程式人生 > >Ubuntu14.04/Linux安裝LLVM/clang-3.7(帶有標準庫 libc++,libc++abi)

Ubuntu14.04/Linux安裝LLVM/clang-3.7(帶有標準庫 libc++,libc++abi)

一、不需原始碼編譯和手動配置libc++,libc++abi的可忽略這一部分
關於如何下載llvm,clang, libc++,libc++abi原始碼請參考第一篇文章第7部分,也可以參考官網有相關安裝說明
http://clang.llvm.org/get_started.html

第一篇文章是手動安裝LLVM/clang和配置libc++,libc++abi,第二篇文章是採用預編譯包安裝LLVM/clang-3.6和手動配置libc++,libc++abi。我之前是參照第一篇文章原始碼安裝,沒有問題,但在配置libc++abi出現了問題,在./buildit 時出現瞭如下錯誤:
../src/cxa_aux_runtime.cpp:15:10: fatal error: ‘typeinfo’ file not found
我能知道的是typeinfo是C++標準庫,尚未找到解決辦法,不知哪位大神能相告,如是便不甚感激!
這個問題沒法解決,但是我通過另一個方法繞過了這個,我下載了預編譯包,然後將lib資料夾中的libc++.so,libc++.so.1,libc++.so.1.0,
libc++abi.a,libc++abi.so,libc++abi.so.1,libc++abi.so.1.0拷貝到/usr/lib/,然後將下載的libc++,libc++abi原始碼包裡的include資料夾裡面的東西都拷貝到/usr/include/c++/v1/下,沒有v1目錄就自己建一個。相關參考命令如下:

sudo cp -r/下載/clang+llvm-3.7.0-x86_64-linux-gnu-ubuntu-14.04/lib/libc++* /usr/lib/
sudo cp -r/下載/libcxxabi/include/* /usr/include/c++/v1/
sudo cp -r ~/下載/libcxx/include/* /usr/include/c++/v1/

這樣弄完了也能用。不過下面介紹一種更為簡單的方法。

二、更為簡單的方法
作業系統:Ubuntu14.04,64位。類似可以推廣到其它Linux系統。

其實Ubuntu14.04安裝LLVM/clang-3.7很簡單,直接到LLVM官網(http://llvm.org/releases/download.html#3.7.0

)下載ubuntu預編譯包(Pre-Built Binaries)——Clang for x86_64 Ubuntu 14.04 (.sig)。然後解壓,進入到解壓的資料夾裡(裡面有四個資料夾bin,include,lib,share),將這四個資料夾拷到/usr/local下(命令列是$sudo cp -r ~/放解壓檔案的目錄名/clang+llvm-3.7.0-x86_64-linux-gnu-ubuntu-14.04/* /usr/local)即可。在終端輸入 clang –v ,就能看見安裝好的 clang 編譯器版本了。 libc++和libc++abi已經配置好,直接使用即可(以前的3.6版本的是沒有配置好的,需要自己配置)。

其它Linux作業系統下載對應的相關預編譯包,按照前述步驟也可使用。想要知道預編譯包是否配置了 libc++和libc++abi,可到解壓的檔案裡的lib資料夾裡看看是否有libc++.so,libc++.so.1,libc++.so.1.0,libc++abi.a,
libc++abi.so,libc++abi.so.1,libc++abi.so.1.0檔案,有的話就表示支援。

三、測試程式碼
建立一個名為new_feature.cpp的文件,寫入:

#include <iostream>
#include <string>

class MyClass
{
  public:
  std::string s ="Hello, world\n"; // Non-static data member initializer
};

int main()
{
  std::cout << MyClass().s;
}

儲存。在終端輸入:
clang++ -std=c++11 -stdlib=libc++ -Werror -Weverything -Wno-disabled-macro-expansion -Wno-float-equal -Wno-c++98-compat -Wno-c++98-compat-pedantic -Wno-global-constructors -Wno-exit-time-destructors -Wno-missing-prototypes -Wno-padded -Wno-old-style-cast -lc++ -lc++abi new_feature.cpp
如果沒問題的話會生成a.out的二進位制檔案,執行它會顯示出Hello,world。這時就大功告成了。
主要編譯選項:
-std=c++11:使用 C++11 新特性;
-stdlib=libc++:指定使用 clang 的標準庫標頭檔案 /usr/include/c++/v1/;
-lc++:指定連結 /usr/lib/libc++.so 標準庫(缺失將導致連結失敗!);
-lc++abi:指定連結 /usr/lib/libc++abi.so 標準庫(缺失將導致連結失敗!)。
其它編譯選項請檢視第一篇或第二篇文章。

四、附錄
何為clang,LLVM,libc++,libc++abi?具體參見官網http://llvm.org/
這裡簡單說兩句:LLVM 是個很大很大的專案群,幾乎把從編譯到除錯的各個構建環節都重新實現了一遍,目的:一是儘可能地模組化現有程式碼以方便在此基礎上進行二次開發、一是提供比傳統構建工具鏈更好的使用者體驗。clang是LLVM的子專案,是一款非常優秀的C++ 編譯器,前端 clang + 後端 LLVM(後簡稱 LLVM/clang)就是一款可替代 GCC 的優秀編譯器。

GCC 配套的標準庫涉及 libstdc++ 和 libsupc++ 兩個子庫,前者是介面層(即,上層的封裝),後者是實現層(即,底層的具體實現),對應到clang,則libc++(介面層)和 libc++abi(實現層)。