您的位置:首页 > 运维架构 > Linux

在CentOS 6.6 64bit上编译安装LLVM3.7,Clang,Libc++和libc++abi

2016-01-02 20:19 856 查看
一、简介

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,参见

/article/7966413.html

三、编译安装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 <iostream>

#include <string>

class MyClass

{

public:

std::string s = "Hello, world\n"; // 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: