一、简介
LLVM
LLVM(之前称为低级虚拟机Low Level Virtual Machine)是一种非常强大的编译器基础架构框架,专门为使用您喜爱的编程语言编写的程序的编译时、链接时和运行时优化而设计。LLVM 可运行于若干个不同的平台之上,它以能够生成快速运行的代码而著称。
LLVM以C++编写而成,对开发者保持开放,并兼容已有脚本。LLVM计划启动于2000年,最初由University of Illinois at Urbana-Champaign的Chris Lattner主持开展。2006年Chris Lattner加盟Apple Inc.并致力于LLVM在Apple开发体系中的应用。Apple也是LLVM计划的主要资助者。
Clang
Clang是一个C++编写、基于LLVM、发布于LLVM BSD许可证下的C/C++/Objective-C/Objective-C++编译器。它与GNU C语言规范几乎完全兼容,并在此基础上增加了额外的语法特性,比如C函数重载,其目标(之一)就是超越GCC。2013年4月,Clang已经全面支持C++11标准,并开始实现C++14特性。Clang支持普通lambda表达式、返回类型的简化处理以及更好的处理constexpr关键字。
二、前提条件
Python 2.7
GCC 4.7以上
CentOS 6.6上面的GCC默认是4.4.7,需要升级到4.8.2,参见
http://blog.csdn.net/tao_627/article/details/50448924
三、编译安装llvm-clang
下面利用svn来下载最新的LLVM、clang及辅助库源码并编译安装
1.下面创建一个顶层目录:
mkdir ~/llvm-clang
2.Checkout LLVM:
cd ~/llvm-clang
svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm
3.Checkout Clang:
cd llvm/tools
svn co http://llvm.org/svn/llvm-project/cfe/trunk clang
cd ../..
4.Checkout extra Clang Tools: (optional)
cd llvm/tools/clang/tools
svn co http://llvm.org/svn/llvm-project/clang-tools-extra/trunk extra
cd ../../../..
5.Checkout Compiler-RT:
cd llvm/projects
svn co http://llvm.org/svn/llvm-project/compiler-rt/trunk compiler-rt
cd ../..
返回~/llvm-clang目录,并新建一个目录llvm-build专门用于编译llvm-clang,使得不污染源码。
mkdir -p llvm-build
cd llvm-build/
建立编译环境
../llvm/configure --enable-optimized
此种配置后,llv-clang默认安装到目录/usr/local/下,如果想改变安装目录,则加上配置: --prefix=Path 来指定,输入
make -j4
编译会耗费一定时间,根据电脑硬件配置来确定时间长短
sudo make install
卸载使用
sudo make uninstall
安装完成后使用
clang -v
查看版本信息
四、安装clang标准库
clang 的标准库————libc++(接口层)和 libc++abi(实现层)需要安装头文件和动态链接库(*.so)。
libc++是C++11实现的标准库
•安装libc++
cd ~/llvm-clang
svn co http://llvm.org/svn/llvm-project/libcxx/trunk libcxx
cd libcxx/lib
./buildit
*.so 文件已生成 ~/llvm-clang/libcxx/lib/libc++.so.1.0,要让 clang 访问必须复制到 /usr/lib/,
cp ./libc++.so.1.0 /usr/lib
cd /usr/lib
sudo ln -sf /usr/lib/libc++.so.1.0 /usr/lib/libc++.so
sudo ln -sf /usr/lib/libc++.so.1.0 /usr/lib/libc++.so.1
为什么要有这三个文件呢?在编译链接的时候,-lc++或者stdlib=libc++,都会去链接libc++.so这个,而在运行的时候,会需要libc++.so.1这个。不知道为什么会这样,但是如果不是这样的话,编译和运行的时候就会出错。
头文件已经生成到 ~/llvm-clang/libcxx/include/,要让clang 找到必须复制到/usr/include/c++/v1/,
因为clang默认libc++的C++标准库头文件位于/usr/include/c++/v1底下
mkdir -p /usr/include/c++/v1/
cp -r ~/llvm-clang/libcxx/include/* /usr/include/c++/v1/
cd ../..
安装 libc++abi
cd ~/llvm-clang/
svn co http://llvm.org/svn/llvm-project/libcxxabi/trunk libcxxabi
cd libcxxabi/lib
./buildit
在lib生成动态库libc++abi.so.1.0,同上操作
cp ./libc++.so.1.0 /usr/lib
cd /usr/lib
sudo ln -sf /usr/lib/libc++abi.so.1.0 /usr/lib/libc++abi.so
sudo ln -sf /usr/lib/libc++abi.so.1.0 /usr/lib/libc++abi.so.1
复制头文件到默认的/usr/include/c++/v1/下面
cp -r ~/llvm-clang/libcxxabi/include/* /usr/include/c++/v1/
更新动态库
ldconfig
以后我们编译时就可以采用下面的格式,比如编译main.cpp文件
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 -lc++ -lc++abi main.cpp
五、检验clang++/libc++/libc++abi
clang 3.0支持几个连 gcc 4.6都没支持的 C++11 特性,比如初始化非静态类成员,看看下面的代码 (new_feature.cpp):
#include
#include
class MyClass
{
public:
std::string s = "Hello, world
"; // Non-static data member initializer
};
int main()
{
std::cout << MyClass().s;
}
第7行直接在类声明处初始化一个 std::string 成员,这是原本只在 Java/C# 里面才能做的事情,如今终于飞入 C++ 程序中。编译命令:
clang++ --std=c++11 -stdlib=libc++ -lc++abi new_feature.cpp
./a.out
输出熟悉的
Hello, world
我们的clang环境就算正式搭建好了。
六、参考文献
[1].http://www.linuxidc.com/Linux/2014-04/99719.htm
[2].http://clang.llvm.org/get_started.html
[3].http://www.xuebuyuan.com/491332.html