編譯器命令

 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  //直接生成一個(gè)可執(zhí)行文件

錯(cuò)誤原因:未識(shí)別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強(qiáng)轉(zhuǎn)成@import形式

./main  //run一下

clear

clang -fmodules -fsyntax-only -Xclang -ast-dump main.m  //查看語(yǔ)法樹(shù)

# 第一部分為環(huán)境

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)優(yōu)缺點(diǎn)

1.C API 來(lái)訪問(wèn)Clang的上層能力,如獲取Tokens、遍歷語(yǔ)法樹(shù)、代碼補(bǔ)全、獲取診斷信息

2.API穩(wěn)定,不受Clang源碼更新影響

3.只有上層的語(yǔ)法樹(shù)訪問(wèn),不能獲取到全部信息

(2)LibClang - 如何使用

1.使用原始C API
2.腳本語(yǔ)言:使用官方提供的python binding 或開(kāi)源的node-js/rubybinding
3.Object-c:開(kāi)源庫(kù)ClangKit

(3)LibClang-Demo

@inteface Sark : NSObject
@property (nonatomic , strong) NSString * backgrond;
@end
代碼中一些常用單詞的拼寫(xiě)錯(cuò)誤
<img
src = "http://chuantu.biz/t5/38/1476940990x981781122.png"
width = "100%"
align = "center"
</img>

運(yùn)行結(jié)果
$python property-linter.py main.m

獲取正確的提示

typo: backgrond, do you mean: background?

LibTooling

(1)優(yōu)缺點(diǎn)

1.對(duì)語(yǔ)法樹(shù)有完全的控制權(quán)
2.可以作為一個(gè)standalore命令單獨(dú)的使用,如clang-format
3.需要使用C++且對(duì)Clang源碼熟悉

LibTooling -Demo

@interface Sark : NSObject

@property (nonatomic , copy)NSString *name;

  • (void)becomeGay;

    @end

實(shí)現(xiàn)一個(gè)建議的Object-c -> Swift源碼轉(zhuǎn)換器
<img
src = "http://chuantu.biz/t5/38/1476941655x981781122.png"
width = "100%"
align = "center"
</img>
創(chuàng)建RecursiveASTVisitor, 在AST中重寫(xiě)感興趣節(jié)點(diǎn)的Visit方法

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

轉(zhuǎn)換完畢之后

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

ClangPlugin

優(yōu)缺點(diǎn)

1.對(duì)語(yǔ)法書(shū)有完全的控制權(quán)

2.作為插件注入到編譯流程中,可以影響build和決定編譯過(guò)程

3.需要使用C++且對(duì)Clang源碼熟悉

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,963評(píng)論 6 542
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,348評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 178,083評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 63,706評(píng)論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,442評(píng)論 6 412
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,802評(píng)論 1 328
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,795評(píng)論 3 446
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,983評(píng)論 0 290
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,542評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,287評(píng)論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,486評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,030評(píng)論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,710評(píng)論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 35,116評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 36,412評(píng)論 1 294
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,224評(píng)論 3 398
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,462評(píng)論 2 378

推薦閱讀更多精彩內(nèi)容