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

摘要:
因为您希望安装LLVM的更新版本并使用预编译的。deb包,使用configure检查软件依赖环境。首先下载所需的源代码。(b) 对于Clang的源代码,首先切换以下文件夹。现在在temp下创建一个构建文件夹,cdbuild/Llvm/configure[option],然后您可以看到已检查了依赖环境。svn获得的默认值不是打开的,将生成与调试相关的内容。

一直想试试这个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]

可以用了,先就这样。

免责声明:文章转载自《LLVM初体验——LLVM,Clang和libc++的编译和安装》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇ROS机器人开发实践学习笔记3java多线程(同步与死锁问题,生产者与消费者问题)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

漏洞挖掘分析技术综述

1.引言网络安全已成为人们日益关注的重要问题。据CNCERT/CC2007年网络安全工作报告的统计,近年来漏洞数量呈现明显上升趋势,不仅如此,新漏洞从公布到被利用的时间越来越短,黑客对发布的漏洞信息进行分析研究,往往在极短时间内就能成功利用这些漏洞。除了利用已知漏洞,黑客们也善于挖掘并利用一些尚未公布的漏洞,发起病毒攻击,或出售漏洞资料,满足经济目的。相对...

一个超级简单的HTML模板框架源代码以及使用示例

HTML模板框架源代码 var HtmlTemplate = (function() { functionHtmlTemplate(htmlSource) { this.htmlSource =htmlSource; } HtmlTemplate.prototype.toHTML = function(params)...

android 4.1源码下载方法最新实例教程

1、安装repo ,执行命令如下: $ curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo $ chmod +x ~/bin/repo 2、初始化 repo ,执行命令如下: $ repo init -u https://android.g...

Linux find查找指定文件 按照名称 然后cp拷贝到指定目录且指定文件名

最近有一个需求,需要将指定目录下的文件(已知文件名)复制到另一个指定的目录且重命名文件。 要求: 在var目录下会定义系统的启动日志相关信息,请查找对应的boot.log文件,并把它备份一份到var/log下 取名为testroad-boot.log。 解决办法:   1.先查看了查找文件的指令规范 就是 find指令           Find命令的一...

setsockopt()使用方法(參数具体说明)

int setsockopt(SOCKET s,int level,int optname,const char* optval,int optlen); s(套接字): 指向一个打开的套接口描写叙述字level:(级别): 指定选项代码的类型。SOL_SOCKET: 基本套接口IPPROTO_IP: IPv4套接口IPPROTO_IPV6: IPv6套...

C#操纵Excel,此工作薄包含嵌入对象,Office 2007的设定方法

C#操纵Excel,插入OLE对象时报“此工作薄包含嵌入对象,EXCEL可能无法从这些对象中删除个人信息。”, 如网上所述,Office 2003可以通过“菜单>>工具>>选项>>安全性中数字签名下有个勾去掉”解决。 Office 2007 呢? 采集 Excel选项→信任中心→个人信息选项,勾选掉“保存时从文件属性...