在Eclipse CDT项目中使用llvm-clang作为编译器并解决gdb调试不显示变量的问题

用了一段时间的Xcode做Mac OSX, iOS的开发后,深深的体会到llvm clang编译器的速度、人性!于是打算在刚换上的Ubuntu 12.10上也装一个好好研究研究。

装好Eclipse Version: 4.2.2和CDT后,先是发现toolchain里只有gcc,意识到又得去google了,好在很容易的就找到了llvm4eclipsecdt这个Eclipse插件(看下面的项目链接或者直接到Eclipse Marketplace里搜llvm clang就能找到),果断装上之后,开了个新C++项目,随便写了几句build,失败,看了一下找不到clang执行程序,猜想应该是还没装伟大的llvm clang编译器吧,打开Ubuntu软件中心一搜,嘿!还真有,这下省事了,直接装上llvm clang还有一些可选项,再回到Eclipse Build运行,ok,一切正常!可后来发现想运行一下Debug吧,却发现虽然断点可以正常下,单步运行也没什么问题,但视图里的局部变量之类的都没有任何显示,watch也不行,根本找不到symbol…开始以为是Eclipse或者CDT的插件安装问题,由于软件中心可用的是个比较旧的3.8版本,有违我一贯的不用稳的只用新的的强迫症作风,于是自己去下的4.2.2 Classic…所以就开始折腾那些toolchain,挨个换,后来发现如果是用默认的gcc就可以正常,为了确认又换命令行手动执行了一次编译链接-O0 -g3,然后挂gdb调试,发现调试符号都提示加载了,b也可以正常下断,并且能够看到source,但就是p不能显示任何变量的值!看来果然是clang的问题了,起初以为是clang和gdb不兼容所致,难道说非得让我一块把lldb也换上?不过据说现在还没用能让Eclipse和lldb结合的方法,后来想了想clang说的就是完全兼容gcc,怎么就会出这种奇怪的gdb问题呢?

搜索一番后发现,确实也有不少人提到clang编译出的执行文件用gdb调试看不到变量的问题,进一步搜索发现,原来这是某版clang的bug!

clang –version看了一下,Ubuntu软件中心装的版本是3.0,而llvm.org上的最新版本是3.2,于是卸掉软件中心的版本,到这里http://llvm.org/releases/download.html拿了一份编译好的Clang Binaries for Ubuntu-12.04/x86_64 (71M),解压到usr/local里,重看version,已经是3.2了。这时注意到llvm4eclipsecdt的作者说

Does not yet work with LLVM 3.2. Works with older versions. This is, because llvm-ld (linker) tool was removed from 3.2.

就是说还不支持3.2版本,因为连接器llvm-ld被去了,开Eclipse试了一下,果然编译没问题,但后面就会报:

Internal Builder: Cannot run program “llvm-ld”: Unknown reason
Error: Program “llvm-ld” is not found in PATH

这样的错误,扫兴的去查llvm-ld的故事,发现有人说直接用clang替掉llvm-ld命令就可以了,于是在项目属性 > C/C++ Build > Settings 选择 LLVM C++ Linker,将里面的llvm命令替换成clang,编译,果然成功生成执行文件了,debug一下,也能正常看到局部变量值了!

 
参考文章:

博主友情提示:

如您在评论中需要提及如QQ号、电子邮件地址或其他隐私敏感信息,欢迎使用>>博主专用加密工具v3<<处理后发布,原文只有博主可以看到。