- 部分转载自:Ubuntu编译安装llvm-clang
- Ubuntu14.04/Linux安装LLVM/clang-3.7(带有标准库 libc++,libc++abi)
- 所需即所获:像 IDE 一样使用 vim
安装
方法一
下载 LLVM、clang 及辅助库源码:
- cd ~/downloads
- svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm
- cd llvm/tools
- svn co http://llvm.org/svn/llvm-project/cfe/trunk clang
- cd ../..
- cd llvm/tools/clang/tools
- svn co http://llvm.org/svn/llvm-project/clang-tools-extra/trunk extra
- cd ../../../..
- cd llvm/projects
- svn co http://llvm.org/svn/llvm-project/compiler-rt/trunk compiler-rt
- cd ..
先关掉其他应用,尽量多的系统资源留给 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的源代码
- wget http://llvm.org/releases/3.6.0/llvm-3.6.0.src.tar.xz
- tar xf llvm-3.6.0.src.tar.xz
- mv llvm-3.6.0.src llvm
下载clang的源代码
- cd llvm/tools
- wget http://llvm.org/releases/3.6.0/cfe-3.6.0.src.tar.xz
- tar xf cfe-3.6.0.src.tar.xz
- mv cfe-3.6.0.src clang
- cd ../..
下载clang-tools-extra的源代码
- cd llvm/tools/clang/tools
- wget http://llvm.org/releases/3.6.0/clang-tools-extra-3.6.0.src.tar.xz
- tar xf clang-tools-extra-3.6.0.src.tar.xz
- mv clang-tools-extra-3.6.0.src extra
- cd ../../../..
下载compiler-rt的源代码
- cd llvm/projects
- wget http://llvm.org/releases/3.6.0/compiler-rt-3.6.0.src.tar.xz
- tar xf compiler-rt-3.6.0.src.tar.xz
- mv compiler-rt-3.6.0.src compiler-rt
- cd ../..
配置编译选项
- 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)
-
echo
LD_LIBRARY_PATH
- if 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
-
LDLIBRARYPATH=
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(实现层)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)