安装
方法一
下载 LLVM、clang 及辅助库源码:
先关掉其他应用,尽量多的系统资源留给 GCC 进行编译 clang 源码
mkdir build cd build ../configure –enable-optimized CC=/usr/bin/GCC CXX=/usr/bin/g++ 接下来,你先洗个澡,再约个会,回来应该编译好了(thinkpad T410I,CPU 奔腾双核 P6000,MEM 4G DDRIII,耗时 2 小时 clang –version 进行确认
方法二
上面的方法在无线网的环境下可能比较慢,推荐下面这种方法
下载llvm的源代码
下载clang的源代码
下载compiler-rt的源代码
配置编译选项
cd .. ./configure –enable-optimized CC=gcc CXX=g++ 注意:3.7.0以后,不允许在源码树中进行构建,我们可以在llvm源码目录同级目录中创建一个目录build目录,然后使用绝对路径进行构建 make -j2 编译llvm 编译成功后的提示: llvm[0]: * Completed Release+Asserts Build make install 安装编译好的llvm clang –version 会安装在/usr/local/bin中,检查clang的版本 clang version 3.6.0 (tags/RELEASE_360/final)
如果还是旧版本,需要将/usr/bin/clang指向clang 3.6.0:
ln -s /usr/local/bin/clang /usr/bin/clang
方法三
有更加简单的方法… 预编译包 其实Ubuntu14.04安装LLVM/clang-3.7很简单,直接到LLVM官网(http://llvm.org/releases/download.html )下载ubuntu预编译包(Pre-Built Binaries)——Clang for x86_64 Ubuntu 14.04 (.sig) 然后解压,进入到解压的文件夹里(里面有四个文件夹bin,include,lib,share),将这四个文件夹拷到/usr/local下 sudo cp -r ~/放解压文件的目录名/clang+llvm-3.7.0-x86_64-linux-gnu-ubuntu-14.04/* /usr/local clang –v 查看版本 libc++和libc++abi已经配置好,直接使用即可(以前的3.6版本的是没有配置好的,需要自己配置) 其它Linux操作系统下载对应的相关预编译包,按照前述步骤也可使用。想要知道预编译包是否配置了 libc++和libc++abi,可到解压的文件里的lib文件夹里看看是否有libc++.so,libc++.so.1,libc++.so.1.0,libc++abi.a,libc++abi.so,libc++abi.so.1,libc++abi.so.1.0文件,有的话就表示支持 如果下载速度慢…百度云 神器…
测试代码
#include <iostream>
#include <string>
class MyClass
{
public :
std ::string s ="Hello, world\n" ;
};
int main()
{
std ::cout << MyClass().s;
}
在终端输入 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 main.cpp 如果没问题的话会生成a.out的二进制文件,运行它会显示出Hello,world 这一大波编译选项很崩溃么 @_@!我来简单说说: -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 标准库(缺失将导致链接失败!)。 详细的见Github的参考文章
添加库文件路径
Find where the library is placed if you don’t know it.
cd / sudo find ./ | grep the_name_of_the_file.so
Check for the existence of the dynamic library path environnement variable(LD_LIBRARY_PATH)
e c h o
LD_LIBRARY_PATHif there is nothing to be display we need to add the default path value (or not as you wich) $ LD_LIBRARY_PATH=/usr/local/lib
We add the desire path and export it and try the application
L D L I B R A R Y P A T H =
LD_LIBRARY_PATH:/my_library/path.so.something$ export LD_LIBRARY_PATH $ ./my_app
或者在/etc/bash.bashrc中添加
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
分隔符
附录
LLVM 是个很大很大的项目群,几乎把从编译到调试的各个构建环节都重新实现了一遍,目的:一是尽可能地模块化现有代码以方便在此基础上进行二次开发、一是提供比传统构建工具链更好的用户体验。clang是LLVM的子项目,是一款非常优秀的C++ 编译器,前端 clang + 后端 LLVM(后简称 LLVM/clang)就是一款可替代 GCC 的优秀编译 GCC 配套的标准库涉及 libstdc++ 和 libsupc++ 两个子库,前者是接口层(即,上层的封装),后者是实现层(即,底层的具体实现),对应到clang,则libc++(接口层)和 libc++abi(实现层)