编译器命令

 cd ~/Desktop 

 touch main.m

 open main.m 

 vi main.m 

 #import <Foundation/Foundation.h>

 int main() {

NSLog(@"Hello world");
return 0;

  }

   clang main.m -o main  //直接生成一个可执行文件

错误原因:未识别Foundation框架

Undefined symbols for architecture x86_64:
"_NSLog", referenced from:
  _main in main-276b38.o
"___CFConstantStringClassReference", referenced from:
  CFString in main-276b38.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

clang -fmodules main.m -o main //-fmodules强转成@import形式

./main  //run一下

clear

clang -fmodules -fsyntax-only -Xclang -ast-dump main.m  //查看语法树

# 第一部分为环境

TranslationUnitDecl 0x7fec3180a6d0 <<invalid sloc>> <invalid sloc>
|-TypedefDecl 0x7fec3180abc8 <<invalid sloc>>   <invalid sloc> implicit __int128_t '__int128'
| `-BuiltinType 0x7fec3180a920 '__int128'
|-TypedefDecl 0x7fec3180ac28 <<invalid sloc>>   <invalid sloc> implicit __uint128_t 'unsigned __int128'
| `-BuiltinType 0x7fec3180a940 'unsigned __int128'
|-TypedefDecl 0x7fec3180acb8 <<invalid sloc>> <invalid sloc> implicit SEL 'SEL *'
| `-PointerType 0x7fec3180ac80 'SEL *'
|   `-BuiltinType 0x7fec3180ab30 'SEL'
|-TypedefDecl 0x7fec3180ad98 <<invalid sloc>> <invalid sloc> implicit id 'id'
| `-ObjCObjectPointerType 0x7fec3180ad40 'id' imported
|   `-ObjCObjectType 0x7fec3180ad10 'id' imported
|-TypedefDecl 0x7fec3180ae78 <<invalid sloc>> <invalid sloc> implicit Class 'Class'
| `-ObjCObjectPointerType 0x7fec3180ae20 'Class'
|   `-ObjCObjectType 0x7fec3180adf0 'Class'
|-ObjCInterfaceDecl 0x7fec3180aec8 <<invalid sloc>> <invalid sloc> implicit Protocol
|-TypedefDecl 0x7fec3180b218 <<invalid sloc>> <invalid sloc> implicit __NSConstantString 'struct    __NSConstantString_tag'
| `-RecordType 0x7fec3180b030 'struct   __NSConstantString_tag'
|   `-Record 0x7fec3180af90 '__NSConstantString_tag'
|-TypedefDecl 0x7fec3180b2a8 <<invalid sloc>> <invalid sloc> implicit __builtin_ms_va_list 'char *'
| `-PointerType 0x7fec3180b270 'char *'
|   `-BuiltinType 0x7fec3180a760 'char'
|-TypedefDecl 0x7fec32000178 <<invalid sloc>> <invalid sloc> implicit __builtin_va_list 'struct __va_list_tag [1]'
| `-ConstantArrayType 0x7fec32000120 'struct __va_list_tag [1]' 1 
|   `-RecordType 0x7fec3180b3a0 'struct __va_list_tag'
|     `-Record 0x7fec3180b2f8 '__va_list_tag'

# 第二部分为自己的代码部分

|-ImportDecl 0x7fec32000eb0 <main.m:1:1> col:1 implicit Foundation
|-FunctionDecl 0x7fec32000f38 <line:3:1, line:8:1> line:3:5 main 'int ()'
| `-CompoundStmt 0x7fec309f5550 <col:12, line:8:1>
|   |-CallExpr 0x7fec309f54d0 <line:5:5, col:25> 'void'
|   | |-ImplicitCastExpr 0x7fec309f54b8 <col:5> 'void (*)(id, ...)' <FunctionToPointerDecay>
|   | | `-DeclRefExpr 0x7fec309f53a0 <col:5> 'void  (id, ...)' Function 0x7fec309ed460 'NSLog' 'void    (id, ...)'
|   | `-ImplicitCastExpr 0x7fec309f5500 <col:11, col:12> 'id':'id' <BitCast>
|   |   `-ObjCStringLiteral 0x7fec309f5440 <col:11, col:12> 'NSString *'
|   |     `-StringLiteral 0x7fec309f5408 <col:12> 'char [12]' lvalue "Hello world"
|   `-ReturnStmt 0x7fec309f5538 <line:6:5, col:12>
|     `-IntegerLiteral 0x7fec309f5518 <col:12> 'int' 0

`-<undeserialized declarations>

生成汇编

    clang -S main.m -o main.s

    vi main.s
# 输出
    retq

    .cfi_endproc



    .section        __TEXT,__cstring,cstring_literals

L_.str: ## @.str

    .asciz  "Hello world"



    .section        __DATA,__cfstring

    .align  3                       ## @_unnamed_cfstring_

L__unnamed_cfstring_:

    .quad   ___CFConstantStringClassReference

    .long   1992                    ## 0x7c8

    .space  4

    .quad   L_.str

    .quad   11                      ## 0xb



    .section        __DATA,__objc_imageinfo,regular,no_dead_strip

L_OBJC_IMAGE_INFO:

    .long   0

    .long   64

.subsections_via_symbols

<img
src = "http://chuantu.biz/t5/38/1476935851x981781122.png"
width = "100%"
align = "center"
</img>

我们能在Clang上做些什么

LibClang

(1)优缺点

1.C API 来访问Clang的上层能力,如获取Tokens、遍历语法树、代码补全、获取诊断信息

2.API稳定,不受Clang源码更新影响

3.只有上层的语法树访问,不能获取到全部信息

(2)LibClang - 如何使用

1.使用原始C API
2.脚本语言:使用官方提供的python binding 或开源的node-js/rubybinding
3.Object-c:开源库ClangKit

(3)LibClang-Demo

@inteface Sark : NSObject
@property (nonatomic , strong) NSString * backgrond;
@end
代码中一些常用单词的拼写错误
<img
src = "http://chuantu.biz/t5/38/1476940990x981781122.png"
width = "100%"
align = "center"
</img>

运行结果
$python property-linter.py main.m

获取正确的提示

typo: backgrond, do you mean: background?

LibTooling

(1)优缺点

1.对语法树有完全的控制权
2.可以作为一个standalore命令单独的使用,如clang-format
3.需要使用C++且对Clang源码熟悉

LibTooling -Demo

@interface Sark : NSObject

@property (nonatomic , copy)NSString *name;

  • (void)becomeGay;

    @end

实现一个建议的Object-c -> Swift源码转换器
<img
src = "http://chuantu.biz/t5/38/1476941655x981781122.png"
width = "100%"
align = "center"
</img>
创建RecursiveASTVisitor, 在AST中重写感兴趣节点的Visit方法

$objc2swift test.m -- -fsyntax-only -fmodules

转换完毕之后

     class Sark: NSObject {<br>
     
        var name: NSString?<br>
        
        func becomeGay() {<br>
        
     }<br>
 } <br>

ClangPlugin

优缺点

1.对语法书有完全的控制权

2.作为插件注入到编译流程中,可以影响build和决定编译过程

3.需要使用C++且对Clang源码熟悉

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容