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

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

一、简介

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

更多相关:

  • 我也遇到过这个问题.这可能不是理想的方式,但它有效.我做了以下事情来解决这个问题 –sudo apt-get install python3-gdbm这为python3安装了gdbm库,但是因为apt-get和anaconda是两个独立的包管理器;这不会解决你的问题.我们主要这样做是为了获取.so共享库,我们将把它放在我们的anaco...

  • 1、去官网下载和自己系统匹配的文件:  英文网址:https://nodejs.org/en/download/  中文网址:http://nodejs.cn/download/  通过  uname -a  命令查看到我的Linux系统位数是64位(备注:x86_64表示64位系统, i686 i386表示32位系统),如图...

  • Ubuntu 12.04 64bit中安装firefox 26中的flash player插件的方法 昨天, 有最新的firefox 26更新了,可是我在软件更新中无法下载到ubuntu官方源中的flash plugin,详细的情况可以参见如下网页,这个问题我一年前也遇到过,特记录下来,以备后来查阅. http://blog....

  • 问题:使用 QT 编写视频展现程序报错找不到运行时库文件 解决办法: 首先 sudo find / -name libpulse.so* 然后 sudo cp /usr/lib/x86_64-linux-gnu/libpulse.so.0 /usr/lib/libpulse.so 对于libpulse-mainloop-glib...

  • OpenCV 一、计算机 中的配置: 在 计算机 -> 属性 -> 高级系统属性 -> 高级 -> 环境变量 -> 系统变量 -> Path 中添加: D:Program Filescpp libopencvuildx64vc15in 二、Visual Studio 中的配置: 1.在 VC++目录 ->...

  • 1.首先要知道什么是ORACLE的客户端: Oracle Instant client 是oracle提供的简便客户端, 支持多种平台. 可从oracle网站下载, 下载地址为http://www.oracle.com/technology/tech/oci/instantclient/index.html 包括如下内容: Inst...

  • 什么是dcevm        dcevm(DynamicCode Evolution Virtual Machine)是java hostspot的补丁(严格上来说是修改),允许(并非无限制)在运行环境下修改加载的类文件.当前虚拟机只允许修改方法体(method bodies),decvm,可以增加 删除类属性、方法,甚至改变一个类...