桌面建個 main.m 文件, 終端進入到桌面 cd Desktop
main.m 文件代碼如下:
#import <Foundation/Foundation.h>
int main(int argc, char * argv[]) {
@autoreleasepool {
__block int count = 10;
void (^ blk)(void) = ^(){
count ++;
NSLog(@"Block:%d", count);
};
count ++;
NSLog(@"%d", count);
blk();
return 0;
}
}
執(zhí)行clang -fobjc-arc -framework Foundation main.m -o main
得到執(zhí)行文件, 雙擊能看到執(zhí)行結(jié)果
Last login: Mon Oct 15 17:25:04 on ttys001
/Users/wei/Desktop/main ; exit;
? ~ /Users/wei/Desktop/main ; exit;
2018-10-15 17:40:50.588 main[62846:2232729] 11
2018-10-15 17:40:50.588 main[62846:2232729] Block:12
[進程已完成]
指令解析:
-fobjc-arc表示編譯需要支持ARC特性加匈。
-framework Foundation表示引用Foundation框架,這個框架中定義了很多基本的類安皱,例如字符串兜叨、數(shù)組奋刽、字典等等钝的。
后面的 mian.m 就是待編譯的源代碼文件名强霎。
-o main 表示輸出的可執(zhí)行文件的文件名是 main夏跷。
執(zhí)行 clang -rewrite-objc main.m
得到 main.m 的 cpp 文件 main.cpp
main.cpp 里面的代碼, 就是編譯器對 main.m 進行轉(zhuǎn)換后的結(jié)果
ps: .m 不到30行的代碼, 在 .cpp 里將近10萬行...
如果在執(zhí)行 clang -rewrite-objc main.m
報錯的, 例如
main.m:9:9: fatal error: 'UIKit/UIKit.h' file not found
#import <UIKit/UIKit.h>
^~~~~~~~~~~~~~~
1 error generated.
執(zhí)行 clang -x objective-c -rewrite-objc -isysroot /Applications/Xcode.app/xxxxx.m
補充知識
得到的 cpp 文件其實就是 C++ 代碼的文件, 但是不同的代碼運行在不同的平臺. 若需要生成運行在64位 iPhone 上的 cpp ,命令如下:
xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m -o main-arm64.cpp
解釋下以上參數(shù):
xcrun: xc 代表 Xcode, 指的是在 Xcode 上運行的
iphoneos: iPhone 系統(tǒng)
xcrun -sdk iphoneos: 通過 Xcode 指定到 iPhone OS
-arch arm64: 64位架構(gòu)
-rewrite-objc: 重寫 OC 文件
-o main-arm64.cpp: 輸出到文件名為 main-arm64.cpp 的文件上
關(guān)于架構(gòu)代碼的解釋:
arm64: 64位
armv7: 32位
i386: 模擬器
偷偷告訴你們, 這樣生成的 cpp , 代碼量大概就在3萬行左右, 對比上面的10萬行, 省事很多
2018.11.30
轉(zhuǎn)換遇到 cannot create __weak reference in file using manual reference
需再加個參數(shù), 完整命令如下
xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc -fobjc-arc -fobjc-runtime=ios-8.0.0 main.m -o main-arm64.cpp
其實就是加了兩個參數(shù)
- -fobjc-arc 是指在 ARC 環(huán)境下編譯;
- -fobjc-runtime=ios-8.0.0 這個是啥子還不是很清楚. 貌似是有運行時參與?! 有了解的小伙伴歡迎留言
參考文獻:
http://www.reibang.com/p/076ab2340121
http://www.reibang.com/p/43a09727eb2c