LLVM/clang & lib路径 & 测试代码

  • 部分转载自: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文件,有的话就表示支持
  • 如果下载速度慢…百度云 神器…

测试代码

  • 建立一个名为main.cpp的文档,写入
    #include 
    #include 
    class MyClass
    {
      public:
      std::string s ="Hello, world\n"; // Non-static data member initializer
    };
    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(实现层)

你可能感兴趣的:(Vim)