查看 OC 對應(yīng)生成的 C++ 代碼

桌面建個 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.itdecent.cn/p/076ab2340121
http://www.itdecent.cn/p/43a09727eb2c

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容