LLVM初体验

LLVM是一套新的C/C++工具链,用来取代GNU的gcc、g++、binutils(如ar、objdump等)。目前XCode 4已经把默认的编译器换成了gcc 4.2+LLVM。即用gcc 4.2做前端,生成中间代码,然后用LLVM把中间代码转换成二进制。LLVM项目还有一个子项目叫clang,是C/C++编译器的前端,用起来就跟gcc/g++基本一样。

在编译速度和最终二进制码的执行效率上来说,LLVM已经勉强可以与GCC匹敌。这个只能看各处的评测报告。

但是在实际可用性上来说,目前还比较惨。GNU有一套C++的标准库,libstdc++。这个必须要打补丁后才能被LLVM/clang编译过去。于是在fedora 17上,clang连一个最最简单的C++的hello world都编译不过去。编译不过的主要原因是: 1. gcc的很多内置关键字,需要clang支持。 2. gcc在对C++11的支持上远胜于LLVM,于是它就可以大胆的在libstdc++的代码中使用很多语言新特性。所以,在这个问题上,LLVM会长期处于被动、被拖累的状态。据说等clang 3.2(这周)发布后对libstdc++的支持会好点。

于是Apple开了一个新项目,libc++来取代libstdc++。目前这个已经用在了Mac OS X上。但是对Linux用户来说,我觉得这是个噩梦。两套C++标准库啊…. 肯定不能混联。不信你把一个libstdc++的string*传递给libc++中试一试…… 那么做发行版的怎么办呢?只有放弃libc++。

总之,如果没有用到太多C++11的标准库,在公司内部的小项目试用LLVM我觉得蛮不错的。起码错误信息更友善一点,节省些开发时间。如果现在的项目是用autotools/cmake管理的话,那么切换起来很简单。设置下CC/CXX这两个环境变量即可。Apple看来是对gcc恨之入骨,等XCode 5发布的时候,估计不会再支持gcc了。

此博客中的热门博文

少写代码,多读别人写的代码

在windows下使用llvm+clang

tensorflow distributed runtime初窥