您的位置:首页 > 运维架构 > Linux

Ubuntu下clang开发工具简易入门知识(一)

2014-07-13 20:43 330 查看
本文部分翻译自http://clang.llvm.org/docs/Tooling.html,加上个人学习经验.

首先,需要要选择好正确的接口(Choosing the Right Interface for Your Application)

基于clang的应用主要三种接口:


LibClang:

一套稳定的高级别C接口, 抽象程度高,以cursor为访问单位(CXCursor),向后兼容性好,有源自于它的python bindings(clang_complete的开源项目中使用了它).

比较好用,最后的工具就像普通的程序一样编译即可,只是要-l的内容多一些,配合RecursiveAST和Rewriter能够做不少事.

文档:http://clang.llvm.org/doxygen/group__CINDEX.html

详细解说可以见以下视频:

视频: http://devimages.apple.com/llvm/videos/Libclang.mov

Pdf: http://llvm.org/devmtg/2010-11/Gregor-libclang.pdf

但要注意这个接口无法完全得到ClangAST的信息,下面两个都可以,但有其他限制.(可以尝试一下将所有的CXCursor中的token输出,和clang plugin中的-ast-dump产生的效果比较一下就知道了)


Clang Plugins

这套接口用于clang在编译时,给AST(抽象语法树)增加一些额外的动作,能够提供lint风格(一款出错检测软件)的warnings 或者 errors,
这个工具可以完全得到ClangAST的信息,但如果离开你的clang的build环境,该工具无法使用.
大致来说该工具的使用样子:

clang++ -D_GNU_SOURCE -D_DEBUG 等配置参数 \ -I几个include路径 待检测文件名(.cpp等) -fsyntax-only \ -Xclang 该工具名(二进制文件)

Clang Plugins介绍文档:http://clang.llvm.org/docs/ClangPlugins.html

可以参考该视频的后半部分(使用了-ast-dump等工具,需要翻wall):http://www.youtube.com/watch?v=VqCkCDFLSsc


LibTooling

这套C++接口可以用来做独立的工具,可以完全控制,目前已有一些Clang的项目加入到Clang官方的Examples中,clang-check,clang-fixit,clang-format等

其中比较有用的是ASTMatcher,它使用了自己的DSL(Domain Specific Language)来匹配一些AST结点.

这是ASTMatcher的文档:http://clang.llvm.org/docs/LibASTMatchersReference.html

ASTMatcher.h:http://clang.llvm.org/doxygen/ASTMatchers_8h_source.html

LibTooling的介绍文档:http://clang.llvm.org/docs/LibTooling.html

PS:

其实翻Wall的视频中介绍了AST结点是什么样子的,我这里再贴一下:

文件内容:

int main(){
int a;
return 0;

}

-ast-dump的结果:

TranslationUnitDecl 0xc809540 <<invalid sloc>>

|-TypedefDecl 0xc809810 <<invalid sloc>> __builtin_va_list 'char *'

`-FunctionDecl 0xc809880 <newfile.c:1:1, line:4:1> main 'int ()'

  `-CompoundStmt 0xc809958 <line:1:11, line:4:1>

    |-DeclStmt 0xc809920 <line:2:2, col:7>

    | `-VarDecl 0xc8098f0 <col:2, col:6> a 'int'

    `-ReturnStmt 0xc809948 <line:3:2, col:9>

      `-IntegerLiteral 0xc809930 <col:9> 'int' 0
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息