zoukankan      html  css  js  c++  java
  • Linux下编译clang、libcxx及其相关库——C++11环境搭建

    一、编译llvm(同时编译compiler-rt和clang)

    1、下载llvm代码:

    svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm

    2、进入llvm/tools目录,下载clang编译器代码:

    cd llvm/tools
    svn co http://llvm.org/svn/llvm-project/cfe/trunk clang

    3、进入llvm/projects目录,下载Compiler-RT代码:

    cd ../.. (back to where you started)
    cd llvm/projects
    svn co http://llvm.org/svn/llvm-project/compiler-rt/trunk compiler-rt

    4、在llvm所在目录新建与llvm同一级的目录build,在其中构建llvm和clang:

    cd ../.. (back to where you started)
    mkdir build (for building without polluting the source dir)
    cd build
    ../llvm/configure
    make

    【说明】:至此,设置环境变量后,clang及clang++就可以使用了,但如果你还想使用clang++ + libcxx模式,那么请接着下面的步骤接着编译libcxx和libcxxabi。

    二、使用clang++编译libcxx和libcxxabi

    1、下载libcxx和libcxxabi代码:

    svn co http://llvm.org/svn/llvm-project/libcxx/trunk libcxx
    svn co http://llvm.org/svn/llvm-project/libcxxabi/trunk libcxxabi

    2、进入libcxx/lib目录进行编译:

    ./buildit

    【说明】:如果要用libcxx + libcxxabi的组合替换掉libstdc++,需要将buildit文件中的-lstdc++选项去掉。

    3、进入libcxxabi/lib目录进行编译:

    ./buildit

    【说明】:(1)如果要用libcxx + libcxxabi的组合替换掉libstdc++,需要将buildit文件中的-lstdc++选项去掉。
              (2)编译过程中可能会报出找不到<unwind.h>头文件的错误,是因为在Mac系统下<unwind.h>是系统头文件(libcxxabi主要还是用在Mac上,似乎Linux上更多的人推荐用libcxxrt),而在Linux中<unwind.h>在/usr/lib/gcc/x86_64-redhat-linux/4.4.4/include/unwind.h目录下(其中目录名称与处理器结构和编译器版本有关)。可以有两种解决方法:
                    A、如果要使用libcxxabi + libunwind的方式,可以指定-I${libunwind-path}/include选项包含libunwind中的头文件,这样的话可能还需要安装libunwind库;
                    B、另一种方法就是使用libcxxabi + libgcc_s的方式这就需要使用/usr/lib/gcc/x86_64-redhat-linux/4.4.4/include目录下的<unwind.h>,但该目录下还有<stddef.h>、<stdarg.h>之类的头文件,如果你使用-I选项指定了该目录,或许是你的编译器所不愿看到事,而libcxxabi中仅仅是需要<unwind.h>中的声明而已,因此可以简单地将/usr/lib/gcc/x86_64-redhat-linux/4.4.4/include/unwind.h拷贝到libcxxabi/include目录下。可是即便是这样,还是有关于__attribute__((__mode__(__unwind_word__)))的错误,对于此错误暂没做深入分析,猜测次编译器扩展中的__unwind_word__只有gcc才认识,你可以简单地将__unwind_word__定义为__word__(#define __unwind_word__ __word__),或将__attribute__((__mode__(__unwind_word__)))注释起来,我就是这么干的,暂没发现错误。

    4、手动安装libc++库和libc++abi库及其头文件,如:

    cd /usr/lib64
    ln -s ${libcxx-path}/lib/libc++.so.1.0 libc++.so.1
    ln -s libc++.so.1 libc++.so
    ln -s ${libcxxabi-path}/lib/libc++abi.so.1.0 libc++abi.so.1
    ln -s libc++abi.so.1 libc++abi.so
    cd /usr/include/c++
    ln -s ${libcxx-path}/include v1

    【说明】:(1)当使用-stdlib=libc++选项后,clang++默认会从/usr/include/c++/v1目录查找libc++头文件;
              (2)上面没有列出${libcxxabi-path}/include的安装位置,此项安装因编译器而异,需要替换掉编译器中的相关头文件。

     5、使用clang++ + libcxx + libcxxabi编译程序(如:test.cpp):

    clang++ -std=c++0x -stdlib=libc++ -lc++abi test.cpp

    【说明】:(1)要是最新的clang,上面的-std=c++0x选项可以改为-std=c++11了;

              (2)-lc++abi要单独指定显得很累赘,clang-developers论坛中有说将libc++abi静态链接到libc++中就不用显示指定了,本人没测试过,只在此记录一下,以后若有必要再做测试。

    三、STL、ABI、UNWIND层次关系

    从libcxx和libcxxabi的主页中可以看出:libc++是C++标准库的一份新的实现,支持C++11新标准,而libc++abi是一份新的支撑(support for)C++标准库的底层实现。这里的libcxx就属于STL层,而libcxxabi则属于ABI层,而unwind暂时不了解,只知道ABI层得依赖于它。下图中列出了各个层次中典型的库:

    理论上讲,各个层次的组合都可以使用,但是各个库对C++11的支持程度不一样,因此不见得所有组合都能使用,常见的组合有:
    (1) libcxx + libcxxabi + libgcc_s
    (2) libcxx + libcxxabi + libunwind
    (3) libcxx + libcxxrt + libunwind
    (4) libstdc++(包括了libsupc++) + libgcc_s
    (5) STLport + libsupc++ + libgcc_s

    参考:
    http://clang.llvm.org/get_started.html
    http://libcxx.llvm.org/
    http://libcxxabi.llvm.org/
    http://clang-developers.42468.n3.nabble.com/libc-abi-on-linux-td4025203.html

  • 相关阅读:
    Maven 安装 / 常用配置 / 阿里maven中央仓库
    记录:框架
    Mysql配置文件详解 my.cof
    Vmware虚拟机设置静态IP地址
    虚拟机安装centos发现inet为127.0.0.1,导致Xshell连接不上
    Servlet小案例总结
    Win10 提升系统响应速度
    从顶端插入,滚动展示(Demo):
    eclipse +cygwin+C++
    大型网站技术学习-3. 容器Docker与kubernetes
  • 原文地址:https://www.cnblogs.com/opangle/p/2605278.html
Copyright © 2011-2022 走看看