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。 

分享即快乐。 

目录
相关文章
|
iOS开发
Xcode报错解决方法:ld: symbol(s) not found for architecture arm64
Xcode报错解决方法:ld: symbol(s) not found for architecture arm64
3273 0
|
3月前
|
编解码 编译器 C++
VS Code C/C++ MSVC编译器
VS Code C/C++ MSVC编译器
70 2
|
6月前
|
编译器 Linux C语言
CMake指定交叉编译指南:从编译器设置到验证 (CMake Cross-compilation Guide: From Compiler Setup to Verification)
CMake指定交叉编译指南:从编译器设置到验证 (CMake Cross-compilation Guide: From Compiler Setup to Verification)
1786 1
|
自然语言处理 JavaScript 前端开发
详解 clang-format 配置选项(基于 clang 8.0.0)
基于 clang 8.0.0 详解 clang-format 中涉及 C/C++ 配置选项的含义,跳过不相关的语言配置选项如 Java, Objective-C, JavaScript。
2807 0
如何解决:./real.exe: error while loading shared libraries: libhdf5hl_fortran.so.100: cannot open shared
如何解决:./real.exe: error while loading shared libraries: libhdf5hl_fortran.so.100: cannot open shared
如何解决:./real.exe: error while loading shared libraries: libhdf5hl_fortran.so.100: cannot open shared
MAC编译lame ld: symbol(s) not found for architecture x86_64/_lame_init_old“, referenced from
MAC编译lame ld: symbol(s) not found for architecture x86_64/_lame_init_old“, referenced from
251 0
NDK编译doubango时出现错误:undefined reference to ‘stderr‘
NDK编译doubango时出现错误:undefined reference to ‘stderr‘
136 0
cmake编译出错:No CMAKE_CXX_COMPILER could be found.
cmake编译出错:No CMAKE_CXX_COMPILER could be found.
455 0
编译x264出现错误:No working C compiler found.
编译x264出现错误:No working C compiler found.
338 0
解决g++编译C++报错unresolved external... (undefined reference ...)
解决g++编译C++报错unresolved external... (undefined reference ...)
318 0
解决g++编译C++报错unresolved external... (undefined reference ...)