clang -rewrite-objc的使用點滴

聽雲APM發表於2016-06-27

原文出自【聽雲技術部落格】:http://blog.tingyun.com/web/article/detail/845

clang -rewrite-objc的作用是把oc程式碼轉寫成c/c++程式碼,我們常用它來窺探OC的一些祕密。

1、最簡單的例子

main.m的程式碼如下:

int main(int argc, char * argv[]) { 
int i=1 ;
__blockint j=0;
void(^aBlock)(void)=^{ 
    j+=2*i;
};
aBlock();
return 0; }

開啟終端,來到main.m所在目錄,執行如下命令:

clang -rewrite-objc main.m

執行之後,目錄下多出一個main.cpp檔案,開啟一看,一兩百行程式碼。其關鍵程式碼如下:

enter image description here

這個例子是用來研究block的原理的,在網上能搜到,本文無意解釋這些程式碼。

2、指定SDK

有的oc程式碼要轉成c程式碼時,在真機和模擬器上差別還是挺大的。如果需要指定SDK,那麼要結合xcrun命令,例如指定真機:

xcrun -sdk iphoneos clang -rewrite-objc main.m

如果要指定模擬器:

xcrun -sdk iphonesimulator clang -rewrite-objc main.m

模擬器和真機都有預設的SDK版本,也可以指定具體某版本:

xcrun -sdk iphonesimulator9.3 clang -rewrite-objc main.m

當然,你要先看看你機器上都裝哪些SDK,xcodebuild命令可以完成這個任務:

2.png

3、指定framework

如果使用了第三SDK,例如(main.m檔案):

#import <UIKit/UIKit.h> 
#import "AppDelegate.h"
#import <tingyunApp/NBSAppAgent.h>//第三方SDK,聽雲的SDK
int main(int argc, char * argv[]) { 
    @autoreleasepool {
        [NBSAppAgent startWithAppID:@"xxxxxxxxxxxxxx”];//啟動聽雲的SDK
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegateclass]));
    } 
}

程式碼中使用了聽雲的SDK,這時執行clang -rewrite-objc ,結果如下:

3.png

出錯了,忘記引入聽雲的這個framework了,clang不知到何處去找,這時需要用-F開關告訴它。

tingyunApp.framework在/Users/goanywhere/Downloads/nbs-newlens-ios-2.3.6下,於是修改指令為: 
xcrun -sdk iphonesimulator9.3 clang -rewrite-objc –F      /Users/goanywhere/Downloads/nbs-newlens-ios-2.3.6  main.m

執行命令,OK,成功了。

以上示例都是為了儘可能簡單,實際上可以同時指定多個原始檔、多個framework。

分享即快樂。

相關文章