在 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 就算正式能用了。