こんにちは、Unityエンジニアのオオバです。
XcodeでビルドしたときARM64関連のエラーが出るときありませんか?具体的には以下のようなエラーです。
Undefined symbols for architecture arm64
「 ARM64アーキテクチャ?と言われても... 」と困っているあなたの悩みを解決する記事です。
「Undefined symbols for architecture arm64」は参照エラーだった
結論から話すと、Unityプロジェクトに「MessageUI.framework」を追加することで解決しました。
今回のケースではiOS向けのネイティブプラグインを開発した際のエラーでした。ネイティブプラグインとは Unityが提供しないOSの機能を使えるようにする拡張 です。iOS向けのネイティブプラグインの場合はではC++やObjective-Cなどの言語を使います。
エラーの原因は ネイティブプラグインに必要なファイルが足りなかったということ です。 つまり単純な参照エラーだったのです。
しかしエラー文から本当の原因を読み解くことは難しいですよね。この記事では 「Undefined symbols for architecture arm64」エラーを解決に導く2つの方法を紹介 します。
仮に原因が参照エラー場合、プラグインに必要なファイルの探し方も分かりやすく解説しています。 Xcodeのビルドエラーで困っている方の助けになれば幸いです。 ぜひ最後まで読んでみてください。
👉DOTweenの教科書を読んでUnityアニメーションをプログラミングしてみよう!
そもそもARM64とは?
エラー「Undefined symbols for architecture arm64」の 「ARM64」 とは何でしょうか。
ARM64とはArm社が開発している CPUのアーキテクチャの1つ です。「CPUアーキテクチャ」とはCPUの基本設計のこと。CPUアーキテクチャに対応したパーツを使用することでパソコンやスマホが動くのです。本題の「ARM64」はデータを64ビット単位で処理することができます。また、現在の スマホのほとんどはARMを採用している ということを覚えておきましょう。
ちなみにUnityのPlayer SettingsからCPUアーキテクチャを設定できます。スマホの場合はARMv7またはARM64の2択です。今はARMv7のシェア率、端末が低性能な点から ARM64だけ選択することが多くなりました。
Xcodeエラー「Undefined symbols for architecture arm64」で試したい2つの方法
ここから本題のXcodeエラー「Undefined symbols for architecture arm64」の直し方を解説します。試したい方法が2つあります。
方法①XcodeのClean Build Folderを試す
方法②必要なファイルが欠損していないか参照エラーを疑う
方法①XcodeのClean Build Folderを試す
まず試してもらいたいことの1つ。Xcodeの「Clearn Build Folder」です。
メニューProduct > Clean Build Folder
から選択します。これで直るケースもあります。短時間で試せるため「Undefined symbols for architecture arm64」に遭遇した際は、最初に試しておきましょう。
方法②必要なファイルが欠損していないか参照エラーを疑う
今回の原因だった参照エラーの解決方法です。本来必要なファイルが欠損しているのではないか疑ってみましょう。とはいっても、手がかりが思いつかないですよね。
まずやるべきことは Xcodeが出力するエラー文を隅から隅まで読んでみる のです。
エラー解決の基本は「エラー文を全部読むこと」
プログラミング全般に言えることですが、エラーを解決するための最短距離は「 エラーを読むこと 」です。もちろん全て英語で読みづらいのはわかります。しかし、 エラー文は解決の大きな手がかり です。
今回出力した「Undefined symbols for architecture arm64」エラーの前後を全て読んでみましょう。重要なエラーは以下の部分です。
Undefined symbols for architecture arm64:
"_OBJC_CLASS_$_MFMailComposeViewController", referenced from:
objc-class-ref in CustomPlugin.o
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
このエラー文は、まず1行目の内容が気になると思います。
Undefined symbols for architecture arm64:
一見、ARM64に対応しないといけない感じがしますが、エラーを読み進めるとそうではないことがわかります。
単純な参照エラーでした
エラーの先を読んでみましょう。解決の手がかりは以下の部分です。
"_OBJC_CLASS_$_MFMailComposeViewController", referenced from:
objc-class-ref in CustomPlugin.o
今回開発した 「CustomPlugin」が使用する「MFMailComposeViewController」がエラーを起こしている ということが読み取れます。
「MFMailComposeViewController」をインターネットで検索すると「MessageUI.framework」が必要だということがわかりました。つまり MessageUI.frameworkをXcodeビルドに含めないといけなかった ということです。
📚 参考サイト : Apple Developer Documentation
Unityプロジェクトに必要なフレームワークファイルを追加で解決
必要なフレームワークファイルをUnityプロジェクトに格納することで 自動的にXcodeプロジェクトに追加 されます。Plugins/iOS/MessageUI.framework
とUnityプロジェクト内に「MessageUI.framework」を配置しましょう。これでUnityからXcode書き出しをしたときに自動でXcodeプロジェクトに含まれます。
「そもそもMessageUI.frameworkはどこにあるのか?」 と困っている方もいますよね。こちらの記事で詳しく解説していますのであわせて読んでみてください。
【Xcode】UnityにiOSフレームワークを自動追加する方法
UnityからiOSフレームワークを追加した状態でXcodeを書き出したくないですか?実はUnity側で自動化できます。
まとめ : Undefined symbols for architecture arm64の直し方
記事の内容を簡単にまとめます。
- とりあえずClean Build Folderを試す
- 64bitアーキテクチャが問題ではない
- エラー文は済から済まで読んで本当の原因を突き止める
- Unityプロジェクトにフレームワークを入れると自動でXcodeビルドに含めてくれる
こんな感じです。
Xcodeビルドにまつわるトラブルは絶えません。 Xcodeのバージョンが上がるとまた新しいトラブルが待っています。 本ブログではXcode系のトラブルも随時共有していますので、iOS向けの開発をしている方はぜひチェックしておいてください。
こちらの記事ではXcodeを使ったiOS実機ビルドの際に発生したエラーをまとめてみました。本記事とあわせて読んでみてください。
この記事があなたのアプリ開発に少しでもお役に立てたら嬉しいです。
この記事が気に入ったらフォローしよう
「Unity初心者大学」というUnity初心者向けのYouTube始めました!!
ぜひチャンネル登録をお願いします!
最後まで読んでいただきありがとうございました!
すばらしいXcodeライフをお過ごしください。
- Unity2018.3.7f1