将OC代码转换成C++代码
OC语言基于C/C++语言,实际上要先经过一层编译将OC代码转换为C++代码,对应的clang命令为:
clang -rewrite-objc xx.m
__weak、__strong
等修饰符报错
如果此时我们用到了__weak、__strong
等修饰符,那就会报错咯
error: cannot create __weak reference because the current deployment target does not support weak references __attribute__((objc_ownership(weak))) NSObject *weakObj = obj;
这是因为__weak
需要运行时objc的支持,需要指定运行时环境
clang -rewrite-objc -fobjc-arc -fobjc-runtime=ios-8.0.0 main.m
#import <UIKit/UIKit.h>
报错
如果我们引入了UIKit框架,那么此命令会报错
main.m:10:9: fatal error: 'UIKit/UIKit.h' file not found
好事多磨啊,这是因为我们没有指定链接的sdk
clang -rewrite-objc -fobjc-arc -fobjc-runtime=ios-8.0.0 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator12.1.sdk main.m
xcrun命令
其实,xcode安装的时候顺带安装了xcrun命令,xcrun命令在clang的基础上进行了一些封装,要更好用一些。
##### 在模拟器下编译
xcrun -sdk iphonesimulator clang -rewrite-objc main.m
#在真机下编译
xcrun -sdk iphoneos clang -rewrite-objc main.m
有时候我们在本机安装了多个Xcode,可以指定xcrun使用不同的Xcode对应的SDK
xcode-select -s /Applications/Xcode9.4.1.app
列出当前xcrun对应的SDK的版本的命令
xcodebuild -showsdks
iOS SDKs:
iOS 12.1 -sdk iphoneos12.1
iOS Simulator SDKs:
Simulator - iOS 12.1 -sdk iphonesimulator12.1
macOS SDKs:
macOS 10.14 -sdk macosx10.14
tvOS SDKs:
tvOS 12.1 -sdk appletvos12.1
tvOS Simulator SDKs:
Simulator - tvOS 12.1 -sdk appletvsimulator12.1
watchOS SDKs:
watchOS 5.1 -sdk watchos5.1
watchOS Simulator SDKs:
Simulator - watchOS 5.1 -sdk watchsimulator5.1
网友评论