iOS编译命令 clang xcrun

应用编译的过程大致为:预处理、编译、汇编、链接等过程。Xcode将这些过程包装为一个Commond+B,但实质上,系统仍旧走完了这些过程。其中Xcode集成了很多编译过程中需要用到的工具链,命令的path为:

/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
屏幕快照 2019-03-12 上午11.20.37.png

写一个.m文件用clang编译成可执行文件:

#import 
  
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框架,那么此命令会报错

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

你可能感兴趣的:(iOS编译命令 clang xcrun)