一、编译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