1. 程式人生 > >在 ubuntu14.04 上安裝 clang 3.6

在 ubuntu14.04 上安裝 clang 3.6

本文所有操作來自下面兩篇部落格

使用預編譯的 clang 

Download LLVM 3.6.0

Pre-builtBinaries:

解壓到 clang+llvm-3.6.0-x86_64-linux-gnu 資料夾

cd clang+llvm-3.6.0-x86_64-linux-gnu
sudo cp -r * /usr/local 

在終端輸入 clang –v

就能看見安裝好的 clang 編譯器版本了

加上 libc++

libc++ 是針對 clang 特別重寫的 C++ 標準庫,也算是 clang 的“御用”庫了。這就像 libstdc++ 和 gcc 的關係,但 clang 也可以用 libstdc++

如果想要用 libc++ ,需要拿下它的程式碼,自己編譯,不過非常容易。首先保證你有

subversion:

sudo apt-get install subversion

然後從 libc++ 程式碼倉庫下載程式碼:

cd ~/Downloads/

svn co http://llvm.org/svn/llvm-project/libcxx/trunk libcxx

cd libcxx/lib

./buildit

標頭檔案已經生成到 ~/Downloads/libcxx/include/,要讓 clang找到必須複製到 /usr/include/c++/v1/

cp -r ~/Downloads/libcxx/include/ /usr/include/c++/v1/

*.so 檔案已生成 ~/downloads/libcxx/lib/libc++.so.1.0,要讓 clang訪問必須複製到 /usr/lib/,並建立軟連結

ln -s ~/Downloads/libcxx/lib/libc++.so.1.0 ~/Downloads/libcxx/lib/libc++.so.1

ln -s ~/Downloads/libcxx/lib/libc++.so.1.0 ~/Downloads/libcxx/lib/libc++.so

cp ~/Downloads/libcxx/lib/libc++.so* /usr/lib/

類似,原始碼安裝 libc++abi的標頭檔案和動態連結庫:

cd ~/Downloads/

svn co http://llvm.org/svn/llvm-project/libcxxabi/trunk libcxxabi

cd libcxxabi/lib

./buildit

標頭檔案已經生成到 ~/Downloads/libcxxabi/include/,要讓 clang找到必須複製到 /usr/include/c++/v1/

cp -r ~/Downloads/libcxxabi/include/ /usr/include/c++/v1/

\*.so檔案已生成~/Downloads/libcxx/lib/libc++abi.so.1.0,要讓 clang訪問必須複製到 /usr/lib/,並建立軟連結

ln -s ~/Downloads/libcxxabi/lib/libc++abi.so.1.0 ~/Downloads/libcxxabi/lib/libc++abi.so.1

ln -s ~/Downloads/libcxxabi/lib/libc++abi.so.1.0 ~/Downloads/libcxxabi/lib/libc++abi.so

cp ~/Downloads/libcxxabi/lib/libc++abi.so* /usr/lib/

建立一個 new_feature.cpp

1#include <iostream>
 2 #include <string>
 3
 4 class MyClass
 5 {
 6 public:
 7  std::string s ="Hello, world\n"// Non-static data member initializer
 8 };
 9
10int main()
11{
12   std::cout << MyClass().s;
13}

後續可以通過如下選項進行程式碼編譯:

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

編譯選項簡單說說:

  • -std=c++11:使用 C++11 新特性;
  • -stdlib=libc++:指定使用 clang 的標準庫標頭檔案 /usr/include/c++/v1/;
  • -Werror:將所有編譯警告視為編譯錯誤;
  • -Weverything:開啟所有編譯警告選項。在 GCC 中,無法通過單個選項開啟所有編譯警告,必須繁瑣的同時指定 -Wall、-Wextra、以及大量分散的其他選項,為此 clang 新增了 -Weverything。

當然,有些警告意義不大,完全可忽略,如下:

  • -Wno-disabled-macro-expansion:禁止使用巨集表示式,忽略此警告;
  • -Wno-float-equal:浮點型別不應使用 != 和 == 運算子,忽略此警告;
  • -Wno-c++98-compat、-Wno-c++98-compat-pedantic:採用 C++11 新特性的程式碼無法相容 C++98,忽略此警告;
  • -Wno-global-constructors:在 main() 之前存在執行的程式碼,忽略此警告;
  • -Wno-exit-time-destructors:在 main() 之後存在執行的程式碼,忽略此警告;
  • -Wno-missing-prototypes:雖有函式定義但缺失函式原型,忽略此警告;
  • -Wno-padded:結構體大小應為 4 位元組整數倍,忽略此警告(編譯器自動調整對齊邊界);
  • -Wno-old-style-cast:C 語言的強制型別轉換,忽略此警告;
  • -lc++:指定連結 /usr/lib/libc++.so 標準庫(缺失將導致連結失敗!);
  • -lc++abi:指定連結 /usr/lib/libc++abi.so 標準庫(缺失將導致連結失敗!)。

輸出熟悉的 Hello, world 

clang 就算正式能用了。