clang -rewrite-objc的使用点滴

简介:

原文出自【听云技术博客】: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();
    return0; 
}

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

clang -rewrite-objc main.m

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

1.png

这个例子是用来研究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 {
        [NBSAppAgentstartWithAppID:@"xxxxxxxxxxxxxx”];//启动听云的SDK
        returnUIApplicationMain(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。 

分享即快乐。 

目录
相关文章
|
弹性计算 固态存储 大数据
2025阿里云服务器租赁价格表一年、1个月和1小时收费标准(200M峰值带宽)
阿里云服务器价格优惠,2025年最新租用费用表显示,轻量应用服务器2核2G配置一年仅需68元(秒杀38元),带200M峰值带宽。云服务器ECS方面,99元/年的2核2G经济型和199元/年的2核4G企业专享型备受青睐。4核16G游戏服务器70元/月,8核32G则160元/月。GPU服务器也有大幅折扣,如T4显卡的gn6i最低配置4核15G一个月1878.40元。续费享有长期折扣,1年7.5折,3年4.5折等。公网带宽和系统盘按需计费,ESSD云盘性能优越,价格透明。详情见官网。
|
存储 监控 NoSQL
掌握GDB调试工具,轻松排除bug(上)
掌握GDB调试工具,轻松排除bug
|
Java 物联网 测试技术
软件测试--详细判断电话号码
软件测试--详细判断电话号码
800 0
三种方法模拟实现库函数strlen,加深对strlen的理解
三种方法模拟实现库函数strlen,加深对strlen的理解
262 0
前缀和求解「任意子数组和的绝对值的最大值」问题|Java 刷题打卡
前缀和求解「任意子数组和的绝对值的最大值」问题|Java 刷题打卡
|
分布式计算 算法 Hadoop
Hadoop专业解决方案-第3章:MapReduce处理数据
前言:非常感谢团队的努力,最新的章节终于有了成果,因为自己的懒惰,好久没有最新的进展了,感谢群里兄弟的努力。 群名称是Hadoop专业解决方案群  313702010 本章主要内容: 理解MapReduce基本原理 了解MapReduce应用的执行 理解MapReduce应用的设计 截止到目前,我们已经知道Hadoop如何存储数据,但Hadoop不仅仅是一个高可用 的,规模巨大的数据存储引擎,它的另一个主要特点是可以将数据存储与处理相结合。
1413 0
|
15天前
|
人工智能 自然语言处理 文字识别
阿里云百炼Qwen3.7-Max简介:能力、优势、支持订阅计划参考
Qwen3.7-Max是阿里云百炼面向智能体时代推出的新一代旗舰模型,对标GPT-5.5、Claude Opus 4.7等闭源旗舰。该模型支持百万级token上下文窗口,具备顶级推理能力、多模态搜索与视觉理解增强、流式输出低延迟响应等核心优势,覆盖编程、办公、长周期自主执行等复杂场景。同时支持OpenAI接口兼容,便于系统快速迁移。用户可通过Token Plan团队或节省计划等订阅方式灵活调用,适合企业级高要求场景使用。
5776 29
阿里云百炼Qwen3.7-Max简介:能力、优势、支持订阅计划参考