一、编译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)编译过程中可能会报出找不到
A、如果要使用libcxxabi + libunwind的方式,可以指定-I${libunwind-path}/include选项包含libunwind中的头文件,这样的话可能还需要安装libunwind库;
B、另一种方法就是使用libcxxabi + libgcc_s的方式这就需要使用/usr/lib/gcc/x86_64-redhat-linux/4.4.4/include目录下的
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