应用编译的过程大致为:预处理、编译、汇编、链接等过程。Xcode将这些过程包装为一个Commond+B,但实质上,系统仍旧走完了这些过程。其中Xcode集成了很多编译过程中需要用到的工具链,命令的path为:
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
写一个.m文件用clang编译成可执行文件:
#import <Foundation/Foundation.h>
int main(int argc, char *argv[]) {
NSLog(@"Clang Hello World");
return 0;
}
命令行下执行:
clang HelloWorld.m -o HelloWorld -framework Foundation
关于clang的详细使用可点击clang[http://clang.llvm.org/]
在当前目录下生成了对应的可执行文件HelloWorld
,执行此程序./HelloWorld
即可。
将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