MacBookM1チップでもOpenSiv3Dを使いたい!


備忘録。かなり前の記事でいろいろやりました。
https://note.com/kunidai/n/nc3fccfb7be06
前使ってたMacの寿命がきたので新しいMacを買いOpenSiv3Dを使おうとしたらバグったので直し方をメモします。

環境

MacBookAir(M1,2020) Big Sur Ver.11.4 (古いパソコンからデータ全部持ってきた)
Xcode : Ver.12.5

前提

今のMacはApple独自のM1チップ(CPUやGPUなどを一纏めにしたもの)を使っていてこれまでの製品と比較して処理速度が少し上がったにもかかわらず消費電力が半分(充電の持ちが倍)という謎ハイスペックになっております。
そのせいで一つ前のMacBookProより今のMacBookAirの方が性能が良い逆転現象が起こっているとか。
そのへんはどうでもいいんですが、問題は「パソコンのCPUやGPUがこれまでと全く異なる」ということです。
M1チップでIntel製のチップの動作を再現するアプリは配られているのでIntel製でしか動かないソフトも問題なく動かせるのですがめちゃくちゃ問題が起きそう。
というか実際問題起きてるからこれ書いてる。つらい。
でも本当にこれが原因なのかもわからない。

エラー: The linked library 'libogg.a' is missing one or more architectures required by this target: arm64.

(これと同様のエラーが20個ほど出る。)

解決法: Bulid Setting -> Excluded Architectures に arm64 を追加

これでこのエラーは消失しました。しかし新たな警告が出現。

警告: Object file (../../lib/macOS/boost/libboost_filesystem.a(path_traits.o)) was built for newer macOS version (10.15) than being linked (10.14)

(これと同様の警告が7つほど出る)

よかった。警告になったし取りあえず動く。一安心。
なにやらMacOSのバージョンが問題のようだ(英弱)。
以前のMacでは容量が足りずにMacのバージョンを上げるのを渋っていたのでそこに警告が出るのは自然に思える。
とりあえずバージョンに関係ありそうな設定を変えてみよう。

解決策: Bulid Setting -> macOS Development Target を macOS11.3 (Max)に変更してみる

これで警告は消えました…が。

エラー: Command CodeSign failed with a nonzero exit code

(詳細に resource fork, Finder information, or similar detritus not allowed とも書いてある。既存の警告は全て消えている。)

なんかエラー出た。分かりそうな英文です。「コマンド『CodeSign』が0でない返り値を返し失敗しました」とのこと。
警告ではなくエラーなのでプログラムは動かなくなりましたが先へ進んでいるものとみなして解決策を探ります。
CodeSignはSignなので暗号か証明書に関わっていそうです。
が、そんなことは無視してエラーメッセージで検索します。

これらを参考に Terminal で次のように打ち込みます。

terminal
cd ~/Downloads/siv3d_v0.4-2.3_macOS/examples/empty
xattr -rc .

(Siv3Dのファイル名にはバージョン名[v0.4-2.3]が含まれているためこのまま実行してもたぶん動きません。また、ファイルの位置をDownloadsから動かしていても失敗します。適宜変更しましょう。)

エラーも警告も全て消えました!

…と思いきやプログラムを少しでも書き換えると先程のエラーが再び出てきます。プログラムを書き換えるごとに先のターミナルのコマンドを実行すれば問題はありませんが、人はそれを問題があると呼びます。手間です。

これを解決するために、キーチェーンアクセスから証明書を消してみたり鍵を全てロックした後解除してみたり新しいパソコンの方でXcodeの新しい証明書を作ってみたりしましたが、以下の手順で解決できました。

1.プログラムをデスクトップから他のディレクトリに移す

以上。
何があったのかさっぱりわかりませんが、動けばヨシ!!
おそらくは「デスクトップ」がiCloud対応のディレクトリだったために勝手にデータの一部が欠損するなどしていたと思われる。(というか他に候補がない)