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

桌面建個(gè) main.m 文件, 終端進(jìn)入到桌面 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

[進(jìn)程已完成]


指令解析:

-fobjc-arc表示編譯需要支持ARC特性。

-framework Foundation表示引用Foundation框架,這個(gè)框架中定義了很多基本的類(lèi),例如字符串、數(shù)組、字典等等。

后面的 mian.m 就是待編譯的源代碼文件名。

-o main 表示輸出的可執(zhí)行文件的文件名是 main。

執(zhí)行 clang -rewrite-objc main.m
得到 main.m 的 cpp 文件 main.cpp
main.cpp 里面的代碼, 就是編譯器對(duì) main.m 進(jìn)行轉(zhuǎn)換后的結(jié)果
ps: .m 不到30行的代碼, 在 .cpp 里將近10萬(wàn)行...

如果在執(zhí)行 clang -rewrite-objc main.m 報(bào)錯(cuò)的, 例如

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

補(bǔ)充知識(shí)

得到的 cpp 文件其實(shí)就是 C++ 代碼的文件, 但是不同的代碼運(yùn)行在不同的平臺(tái). 若需要生成運(yùn)行在64位 iPhone 上的 cpp ,命令如下:
xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m -o main-arm64.cpp

解釋下以上參數(shù):
xcrun: xc 代表 Xcode, 指的是在 Xcode 上運(yùn)行的
iphoneos: iPhone 系統(tǒng)
xcrun -sdk iphoneos: 通過(guò) Xcode 指定到 iPhone OS
-arch arm64: 64位架構(gòu)
-rewrite-objc: 重寫(xiě) OC 文件
-o main-arm64.cpp: 輸出到文件名為 main-arm64.cpp 的文件上

關(guān)于架構(gòu)代碼的解釋:
arm64: 64位
armv7: 32位
i386: 模擬器

偷偷告訴你們, 這樣生成的 cpp , 代碼量大概就在3萬(wàn)行左右, 對(duì)比上面的10萬(wàn)行, 省事很多

2018.11.30

轉(zhuǎn)換遇到 cannot create __weak reference in file using manual reference
需再加個(gè)參數(shù), 完整命令如下
xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc -fobjc-arc -fobjc-runtime=ios-8.0.0 main.m -o main-arm64.cpp
其實(shí)就是加了兩個(gè)參數(shù)

  • -fobjc-arc 是指在 ARC 環(huán)境下編譯;
  • -fobjc-runtime=ios-8.0.0 這個(gè)是啥子還不是很清楚. 貌似是有運(yùn)行時(shí)參與?! 有了解的小伙伴歡迎留言

參考文獻(xiàn):
http://m.itdecent.cn/p/076ab2340121
http://m.itdecent.cn/p/43a09727eb2c

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

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

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