LLVM初体验——LLVM,Clang和libc++的编译和安装

一直想试试这个LLVM的,据说错误提示信息比GCC好,C++11支持的也更多。今天编译的时候,发现用了几个C++11特性了,gcc4.4没法编译,于是想,那就尝试一下LLVM吧。

既然是想安装比较新的版本的LLVM,新立得软件包上的肯定不是好的选择。想用预编译好的.deb包,却发现不支持ubuntu10.04,好像11.10之后的是可以用deb包的。那就源代码编译吧,这应该总是可以的。

目的,LLVM和Clang,编译C/C++,
环境Ubuntu10.04,X86,gcc4.4.

先搞清楚要准备哪些东西,在http://llvm.org/docs/GettingStarted.html#getting-started-with-llvm上,讲的还是比较清除的,软件依赖环境用configure检查吧。
先下载需要的源代码,
(a)LLVM的源代码,
在某个文件夹temp下,
svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm
下载完成之后,就可以看到temp下面有个llvm的文件夹。
(b)Clang的源代码
先切换以下文件夹,
cd llvm/tools
svn co http://llvm.org/svn/llvm-project/cfe/trunk clang
(c)extra Clang tools,这个是可选的,
同样,需要先切换文件夹,注意切换的时候,都是以temp为当前目录的。
cd llvm/tools/clang/tools
svn co http://llvm.org/svn/llvm-project/clang-tools-extra/trunk extra
(d)最后一个源代码,Compiler-RT
cd llvm/projects
svn co http://llvm.org/svn/llvm-project/compiler-rt/trunk compiler-rt

接下来就要开始编译了,
现在temp下建立一个build文件夹,存放编译生成的东西。
然后进入build文件夹,生成配置文件。
cd build
../llvm/configure [option]
那么就可以看到开始检查依赖环境,如果没有问题,就会生成makefile了。
这里在configure的时候,可以添加一些选项。
在Local LLVM Configuration部分(http://llvm.org/docs/GettingStarted.html#local-llvm-configuration),可以看到支持的选项,
这里我使用了--enable-optimized(打开优化,svn得到的默认值是不打开的,会生成debug的相关内容,觉得没有必要,而且会占用较大的空间,就不要了)
另一个选项,--enable-targets=target-option,这个很重要,选择目标平台的,一般情况下使用host-only就可以了,只需要适合本机的情况就可以了,
默认情况下会生成所有平台的,没有必要。
还有一个是assert的选项,--enable-assertions,这个需要吗?不太清楚,默认是打开的,可以使用--disable-assertions关闭,我猜是这样,好像没有看到说怎么关闭这个。其它选项就没关注了。

还有想找的一个配置选项是,只针对C/C++,包括Python也可以,不需要对所有语言,文档里有说可以这样做,但就是没找到怎样做。

生成makefile之后,就开始make了。make可以指定多线程同时工作,例如make -j2,没有这样使用,其它的make clean, make dist-clean也可以使用。(编译了好长时间,早知道就用-j2了,就两核,-j4估计不会有很大的改变)

最后一步,就是make install了。默认情况下会安装到/usr/local/下面。

这样,clang应该是安装好了,接下来要做的事情的,安装libc++。这个是为C++11实现的标准库,既然是为了C++11才安装的LLVM,那么这个肯定也是要安装的了。

http://www.cnblogs.com/ralphjzhang/archive/2011/12/02/2272671.html

http://clang.llvm.org/cxx_status.html上面有一句话,Clang可以以两种方式使用C++11,一种是使用libc++,另一种是是使用libstdc++,这个是GCC使用的标准库,但是在libstdc++4.4,4.6,4.7上,需要打补丁,Clang才能使用。既然这样的话,肯定是直接使用libc++了。

安装方法,在http://www.cnblogs.com/ralphjzhang/archive/2011/12/02/2272671.html这里说了一些,但是测试的时候还是出现了一些问题,下面是具体的过程,测试通过。

在上面提到的temp目录下,仍然是使用svn下载源代码,
svn co http://llvm.org/svn/llvm-project/libcxx/trunk libcxx
然后,
cd libcxx/lib
./buildit
那么在lib下面就生成了需要的动态库文件, libc++.so.1.0。到这里,那篇博文里面的都还对,后面的其实也对,不过建立链接的时候有些问题。
sudo cp ./libc++.so.1.0 /usr/lib
cd /usr/lib
sudo ln -sf /usr/lib/libc++.so.1.0 libc++.so
sudo ln -sf /usr/lib/libc++.so.1.0 libc++.so.1
区别在于,ln -sf 源文件 目标链接,而且使用的是绝对路径,这样,在/usr/lib/下面会有三个文件。
为什么要有这三个文件呢?在编译链接的时候,-lc++或者stdlib=libc++,都会去链接libc++.so这个,而在运行的时候,会需要libc++.so.1这个。不知道为什么会这样,但是如果不是这样的话,编译和运行的时候就会出错。借用博文里面的例子,测试通过。

下面是在StackOverflow上看到的使用方法,http://stackoverflow.com/questions/10601545/clang-3-1-and-c11-support-status
# uses clang's C++ library in C++98 mode
clang++ -stdlib=libc++ [input] # uses clang's C++ library


# uses clang's C++ library and enables C++11 mode
clang++ -stdlib=libc++ -std=c++11 [input]
clang++ -stdlib=libc++ -std=c++0x [input]

可以用了,先就这样。

posted @ 2012-10-20 20:56  Frandy.CH  阅读(13828)  评论(3编辑  收藏