デスクトップに main.m ファイルを作成します。端末がデスクトップに入ったときの main.m ファイルのコードは cd Desktop
次のとおりです。
#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;
}
}
実行しclang -fobjc-arc -framework Foundation main.m -o main
て実行可能ファイルを取得し、ダブルクリックして実行結果を確認します
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 フレームワークを参照することを意味します。
次の mian.m はコンパイルするソース コード ファイルの名前です。
-o main は、出力される実行可能ファイルのファイル名が main であることを示します。
clang -rewrite-objc main.m
main.m の cpp ファイル main.cppを実行します
。main.cpp のコードは、コンパイラが main.m を変換した結果です。
ps: .m のコードは 30 行未満ですが、.cpp には 100,000 行近くあります。 ..
実行中にエラーが報告された場合 clang -rewrite-objc main.m
、たとえば
main.m:9:9: fatal error: 'UIKit/UIKit.h' file not found
#import <UIKit/UIKit.h>
^~~~~~~~~~~~~~~
1 error generated.
埋め込む 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
上記のパラメータについて説明します。
xcrun: xc は Xcode の略で、Xcode 上で実行されている iphoneos を指します。
iPhone システム
xcrun -sdk iphoneos: Xcode を通じて iPhone OS に指定
-arch arm64: 64 ビット アーキテクチャ
-rewrite-objc: OC ファイルを書き換えます
-o main-arm64.cpp: main-arm64.cpp という名前のファイルに出力します。
アーキテクチャコードの説明:
arm64: 64 ビット
armv7: 32 ビット
i386: シミュレータ
こっそり教えますが、この方法で生成される cpp のコード量は約 30,000 行で、上記の 100,000 行に比べればかなり手間が省けます。
2018.11.30
変換する際には、 cannot create __weak reference in file using manual reference
別のパラメータを追加する必要があります。完全なコマンドは次のとおりです。xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc -fobjc-arc -fobjc-runtime=ios-8.0.0 main.m -o main-arm64.cpp
実際には、2 つのパラメータが追加されます。
- -fobjc-arc は、 ARC 環境でコンパイルすることを意味します。
- -fobjc-runtime=ios-8.0.0