clang -rewrite-objc的使用点滴

更多技术干货请戳:听云博客css

clang -rewrite-objc的做用是把oc代码转写成c/c++代码,咱们经常使用它来窥探OC的一些秘密。 ios

一、最简单的例子c++

main.m的代码以下: web

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

打开终端,来到main.m所在目录,执行以下命令: xcode

clang -rewrite-objc main.m

执行以后,目录下多出一个main.cpp文件,打开一看,一两百行代码。其关键代码以下: iphone

1.png

这个例子是用来研究block的原理的,在网上能搜到,本文无心解释这些代码。 ui

二、指定SDKspa

有的oc代码要转成c代码时,在真机和模拟器上差异仍是挺大的。若是须要指定SDK,那么要结合xcrun命令,例如指定真机: code

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

若是要指定模拟器: blog

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

模拟器和真机都有默认的SDK版本,也能够指定具体某版本: 

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

固然,你要先看看你机器上都装哪些SDK,xcodebuild命令能够完成这个任务:

2.png

三、指定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。 

分享即快乐。

原文连接:http://blog.tingyun.com/web/article/detail/845 

相关文章
相关标签/搜索