看很多的大牛在博客里写的runtime各种原理实现,剖析各种实现。直接使用clang来获取c++源码,但是自己实践的情况下总是在一些细节问题,例如:
clang -rewrite-objc xxx.m
这个就是一个由.m 转换为.cpp文件的clang命令,但是自己实际操作时是这样子的:
屏幕快照 2019-04-18 下午11.03.20.png
顿时一阵抓狂,难道是我操作有问题?不应该啊,好多的博客都是这样的,但是具体的是为什么不行呢?遂在Google上找到各种类似的解决办法,但都没有对症下药,无论尝试那种办法都报'UIKit/UIKit.h' file not found的错。
这个具体事为什么呢?
实在想不到更好的方式,只能是慢慢思考这个问题,从字面意思来说就是依赖的库并没有找到。那这样的思路是不是就是依赖一下相应的库就可以呢?依赖的库也都是xcode自动打包好的,但是在xcode的目录下是有相应的sdk的。所以进行一下试想将sdk一起加入到编译中。由此从网上找了一些关于类似的方式:
clang -x objective-c -rewrite-objc -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk xxxxx.m
实践结果如下
屏幕快照 2019-04-18 下午11.23.30.png
很遗憾,这种方式还是存在一些问题,仔细查看相关报错信息:
屏幕快照 2019-04-18 下午11.32.44.png这个UIWebview在Mac下是不可用的。既然不让这么粗暴的方式调用,突然想起熟悉又陌生的xcrun,那么结合xcrun呢?xcrun只有之前写自动化测试脚本的时候用到过,知道他的强大。完全可以使用这个工具完成这个编译工作,一顿操作过后......
// 模拟器的情况下
xcrun -sdk iphonesimulator clang -rewrite-objc xxx.m
//真机的情况下
xcrun -sdk iphoneos clang -rewrite-objc xxx.m
效果如下:
屏幕快照 2019-04-18 下午11.26.38.png
真香定理,到此,这么一个简单的命令操作完毕,可以继续分析相关的底层实现原理。其实大部分mac下的开发,根据报错信息经过分析信息都可以分析个八九不离十,在结合上面向百度编程的思路,大部分都是没啥问题。如果没有报错信息是最坑的。下次在继续写一下最近遇到的坑。
网友评论